假设,我想创建一个B带有指向另一个类的指针的类A。在A我想构造的构造函数中B,并传递一个指向this. 原则上,这个指针可以是 a shared_ptr,对吗?那么如何shared_ptr通过构造函数中的赋值来创建这样的类呢?
我在下面的代码中尝试过。ClassB和ClassC是相同的,带有一个指向ClassA它的构造ClassB和实例的指针ClassC。唯一的两个区别是ClassB持有一个常规指针并ClassC持有一个shared_ptrto ClassA,以及带有的代码ClassB正在工作,而带有的代码ClassC则没有。我究竟做错了什么?
// Main.cpp : Defines the entry point for the console application.
#include "ClassA.h"
#include <iostream>
int main(int argc, char* argv[])
{
    std::cout << "Create B and C separately, without a reference to A:" << std::endl;
    ClassB(nullptr);
    ClassC(nullptr);
    std::cout << "Create A, and through it B and C:" << std::endl;
    ClassA A;
    A.PrintHello();
    A.getObjectB().getPointerToA()->PrintHello();
    A.PrintHello();
    A.getObjectC().getPointerToA()->PrintHello();
    return 0;
}
// ClassA.h
#pragma once
#include "ClassB.h"
#include "ClassC.h"
class ClassA
{
private:
    ClassB objectB;
    ClassC objectC;
public:
    ClassA(void);
    ClassB getObjectB() { return objectB; };
    ClassC getObjectC() { return objectC; };
    void PrintHello();
};
// ClassA.cpp
#include "ClassA.h"
#include <iostream>
#include <memory>
ClassA::ClassA(void) : objectB(ClassB( this )), objectC(ClassC( std::make_shared<ClassA>(*this) ))
{
    std::cout << "Class A fully constructed" << std::endl;
}
void ClassA::PrintHello()
{
    std::cout << "Hello" << std::endl;
}
// ClassB.h
#pragma once
#include <memory>
class ClassA;
class ClassB
{
private:
    ClassA* pointerToA;
public:
    ClassB(ClassA* pA);
    ClassA* getPointerToA() { return pointerToA; };
};
// ClassB.cpp
#include "ClassB.h"
#include <iostream>
ClassB::ClassB(ClassA* pA) : pointerToA(pA)
{
    std::cout << "Class B constructed" << std::endl;
}
// ClassC.h
#pragma once
#include <memory>
class ClassA;
class ClassC
{
private:
    std::shared_ptr<ClassA> pointerToA;
public:
    ClassC(std::shared_ptr<ClassA> pA);
    std::shared_ptr<ClassA> getPointerToA() { return pointerToA; };
};
// ClassC.cpp
#include "ClassC.h"
#include <iostream>
ClassC::ClassC(std::shared_ptr<ClassA> pA) : pointerToA(pA)
{
    std::cout << "Class C constructed" << std::endl;
}