我自己解决的。指针,但我不知道为什么

Solved by myself. Pointers but i don't know why

本文关键字:我不知道 为什么 指针 解决 我自己      更新时间:2023-10-16

这是我不理解的。获得了2个课程:Classa和ClassB。当我用指向classa指针的参数构造函数创建classB时。。(已经解决了,但我不知道为什么?)(这一切都可以吗?只想在没有逻辑错误的情况下写它)我通过更改" *"的位置解决了它。来自

    pointerB = new ClassB(*this);
to
    pointerB = new ClassB(this);
and
ClassB::ClassB(ClassA pointer)
to
ClassB::ClassB(ClassA *pointer)

旧代码:

main.cpp
#include "stdafx.h"
#include <iostream>
#include "ClassA.h"
#include "ClassB.h"
    int main()
    {
        //pointer for object ClassA
        ClassA *A;
        //New Object
        A = new ClassA();

        getchar();
        return 0;
    }
ClassA.cpp
    #include "stdafx.h"
    #include "ClassA.h"

    ClassA::ClassA()
    {
        std::cout << "CLASS A OBJECT CREATED" << std::endl;
        //Creation of B
        pointerB = new ClassB();
        pointerB = new ClassB(*this);
    }

    ClassA::~ClassA()
    {
        std::cout << "CLASS A OBJECT DELETED" << std::endl;
    }
ClassA.h
    #pragma once
    #include <iostream>
    #include "ClassB.h"
    extern class ClassB;
    class ClassA
    {
        ClassB *pointerB;
    public:
        ClassA();
        ~ClassA();
    };
ClassB.cpp
    #include "stdafx.h"
    #include "ClassB.h"

    ClassB::ClassB()
    {
        std::cout << "CLASS B OBJECT CREATED by constructor" << std::endl;
    }
    ClassB::ClassB(ClassA pointer) {
        std::cout << "CLASS B OBJECT CREATED with pointer" << std::endl;
    }
    ClassB::~ClassB()
    {
        std::cout << "CLASS B OBJECT DELETED" << std::endl;
    }
ClassB.h
    #pragma once
    #include <iostream>
    #include "ClassA.h"
    extern class ClassA;
    class ClassB
    {
        ClassA * pointerA;
    public:
        ClassB();
        ClassB(ClassA *pointer);
        ~ClassB();
    };

在声明 ClassB::ClassB(ClassA pointer)中,构造函数的参数是类型 ClassA 不是的对象,是指向类型ClassA对象的指针。因此,您必须在旧代码中放置this指针。在呼叫pointerB = new ClassB(*this);中,ClassB的构造函数 not 接收由this指向的实例,但该实例的A copy 。该调用返回后将删除该副本。这就是为什么您会看到ClassA的攻击者被调用的原因。如果您在构造函数和驱动器中输出this指针(例如,作为十六进制整数),您会发现构造函数和驱动器中有不同的this指针。或者更好:使用调试器,您会看到这一点。您也可以声明ClassA的复制构造函数,然后您会看到它在pointerB = new ClassB(*this);中被调用。

现在,如果您希望将this指向的实例传递给ClassB的构造函数,则可以通过将其声明为指针,就像您在解决方案中所做的那样,也可以将其传递给参考。例如。您将ClassB的构造函数声明为

 ClassB::ClassB(ClassA& aClassA) {}

然后,您可以致电pointerB = new ClassB(*this);,而无需复制ClassA对象。

关于您的代码的一些小评论:

  • 尝试避免标题文件中不必要的依赖项。您不需要#include <iostream>中的CC_18,因为ClassA.h中的任何内容都没有取决于它。ClassA.cpp中的代码仅取决于<iostream>。因此,您应该在那里包括。

  • 远期声明是一件好事,有助于避免不必要的内容。但是语法仅为class ClassB;(没有" extern")。那么您不需要#include "ClassB.h"中的CC_25。

  • 如果某物不是指针,则不应将其称为pointer。这可能是所有错误的根源。

在您更改更改classa对象的副本之前,请传递给classB构造函数。构造函数完成后,该副本被销毁了。这就是为什么您看到毁灭者的印刷品。

默认情况下,编译器将创建复制构造函数,该复制构造函数将所有数据盲目地将所有数据隐式地隐含地复制到新位置。如果您想查看复制构造函数的调用,则应定义自己的构造函数,该构造函数接受相同类型ClassA(const ClassA&)的常量参考。

更改后,传递了已经创建的对象的地址,因此未创建副本。

我不会说您的代码还可以。您违反了三个规则,因为您使用自己的驱动器,并且未能创建复制构造函数和分配运算符。请参阅-https://en.cppreference.com/w/cpp/language/rule_of_three。另外,用"新"创建的对象未正确删除。