B
別のクラスへのポインタを持つクラスを作成したいとしますA
。のコンストラクターで、A
へのポインターを作成B
して渡しますthis
。原則として、このポインタはshared_ptr
正しいですか?shared_ptr
では、コンストラクターでの割り当てを使用して、このようなクラスを作成するにはどうすればよいですか?
以下のコードで試してみました。ClassB
とClassC
は同一であり、とのClassA
インスタンスを構成するポインタがClassB
ありますClassC
。唯一の2つの違いはClassB
、通常のポインターをClassC
保持し、shared_ptr
toClassA
を保持し、withのコードClassB
が機能し、withのコードが機能し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;
}