나는 고급 프로그래머가 아닙니다.다이아몬드의 std :: unique_ptr을 통해 가장 기본 클래스의 보호 된 멤버 변수에 액세스 할 수 없습니다.
class Base
class A: virtual public Base
class B: virtual public Base
class Last: public A, public B
한다고 가정 Base
변수, m_x
있다, 즉, A
, 또는 B
의 한, 한 번에 호출 할 수있는, A
및 B
에 공통 같은되지 않습니다 : 고전적인 다이아몬드 상속이 가정 둘 다 필요합니다. 이 문제를 얻으려면이 사용된다
class Last: public A, public B
{
private:
std::unique_ptr<Base> m_p;
public:
Last(int i)
{
if (i)
m_p = std::unique_ptr<Base>(new A());
else
m_p = std::unique_ptr<Base>(new B());
}
};
이 괜찮지 만, 그것이 보호 말한다 때문에 지금 m_p->m_x
더 이상 액세스 할 수 없습니다,하지만 문제 직접 생성자 모두 A
및 B
전화 m_x
.
알려진 제한 사항입니까 아니면 잘못된 방법입니까? 그것이 틀린 경우, 거기에 어떤 해결책이 있습니까? 여기
는 도면에 기초하여 몇 가지 코드 (페이지에서 약간 아래) here 발견 : 때문에 컴파일 (답변이 코멘트에 따른) 모두
this->m_p
및
this->Power::m_x
사용
#include <iostream>
#include <memory>
class Power
{
protected:
double m_x;
public:
Power() {}
Power(double x): m_x {x} {}
virtual ~Power() = default;
};
class Scanner: virtual public Power
{
public:
Scanner() {}
Scanner(double x): Power(x) {} // scan document
};
class Printer: virtual public Power
{
public:
Printer() {}
Printer(double x): Power(x) {} // print document
};
class Copier: public Scanner, public Printer
{
private:
std::unique_ptr<Power> m_p;
public:
Copier() {}
Copier(double x, int i)
{
if (i)
m_p = std::unique_ptr<Power>(new Scanner(x));
else
m_p = std::unique_ptr<Power>(new Printer(x));
}
void print() { std::cout << this->Power::m_x << '\n'; }
};
int main(int argc, char *argv[])
{
Copier *copier {new Copier(1.618, 0)};
copier->print();
copier = new Copier(3.14, 1);
copier->print();
return 0;
}
되지만 출력 0
입니다.
나는 모든 그것을 밖으로 철자 확인하려면 다음뿐만 아니라 꽤 초보자,하지만, 위의 예를 주어, 정말 Scanner
또는를 호출하는 또 다른 대안이있는 경우 그 상태를 유지해야 oesn't Printer
내부에서 한 번에 하나씩 Copier
. 나는 의견을 묻는 것이 아니며, 금지되어 있다는 것을 이해하지만, 경험 많은 사용자로부터 오는 의견은 거부하지 않을 것입니다. 결국, 나는 배우 고있다.
나는 'Last' * is-a * A와 * is-a * B가 어떻게되는지 이해하지 못한다. 그런데 A 나 B 중 하나가 나에게 의미가 없다. – nvoigt
'm_p'는 기본 객체가 아닙니다. '이'입니다. –
@CaptainGiraffe'm_p-> m_x'를 사용하는 대신'this-> m_x'를 사용해야합니까? 나는 단지'm_p'를'this'로 대체하고 컴파일하지만 작동하지 않는 것 같습니다. 변수는 모두 0입니다. 정교하게 제발 주시겠습니까? –