我自己解决的。指针,但我不知道为什么
Solved by myself. Pointers but i don't know why
这是我不理解的。获得了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。另外,用"新"创建的对象未正确删除。
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 我不知道为什么这段代码会让核心被转储?
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- if-else 语句仅按特定顺序工作,我不知道为什么
- DirectX 11 引擎在第三次代码改进后没有突然运行,我不知道为什么
- 函数抛出seg错误,我不知道为什么
- 我不知道为什么复制构造函数的调用在 c++ 中不稳定
- 随着时间的推移,我的程序越来越慢,我不知道为什么.内存泄漏
- "错误:在'.标记'之前出现预期的主表达式,我不知道为什么
- 我正在制作c ++代码,但发生错误我不知道为什么
- std::cout << glGetString(GL_RENDER) << std::endl;抛出错误但不GL_Renderer或GL_Verision,我不知道为什么?
- 我的Arduino串行命令行不起作用,我不知道为什么
- 我正在编写一个拆分为 3 的合并排序,我不知道为什么它不起作用
- 我不知道为什么我的矢量无法推回
- 语法检查器指出一些我不知道为什么的错误
- 我不知道为什么我的字符串无法保存值
- 编写蒙特卡洛集成程序,我不知道为什么我会收到某些错误
- 我不知道为什么会发生堆损坏(关于内存分配问题)
- 库特是空的,我不知道为什么
- C++:我需要在这里包含这个标题,我不知道为什么