gpt4 book ai didi

c++ - 如何在派生类中定义内部类成员?

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:47 24 4
gpt4 key购买 nike

#include<iostream>
using namespace std;
class A{
public:
class B{
public:
void fun1();
};
};

class C:public A{
public:
B::fun1(){ // This line gives Error:can not define member function B::fun1() in C

}
};
int main(){
C ob;
return 0;
}

有什么方法可以在派生类中定义内部类成员吗?这个错误背后的原因是什么?

最佳答案

问题是您试图在与声明函数的类范围不同的类范围内定义函数。例如,考虑您代码的这个扩展版本:

class A{
public:
class B{
public:
void fun1();
void fun2();
};

void fun3();

void B::fun2() {} // Error.
};

class C:public A{
public:
void B::fun1() {} // Error.
void A::fun3() {} // Error.
};

所有三个错误都会给出相同类型的错误消息,“无法在 Z 中定义成员函数 X::Y()”。


为了解决这个问题,如果A::B::fun1()C::B::fun1()需要有不同的实现,你可以推导来自嵌套类。

class A {
public:
class AB_ {
public:
virtual void fun1();
};

typedef AB_ B;
};
void A::AB_::fun1() {}

class C : public A {
public:
class CB_ : public A::AB_ {
void fun1() override;
};

typedef CB_ B;
};
void C::CB_::fun1() {}

在这种情况下,您可以在外部使用 B 来访问嵌套类的最派生版本,或者使用 A::AB_C: :CB_ 直接。同样,你可以这样写:

class A {
class AB_ {
public:
virtual void fun1();
} b;

public:
typedef AB_ B;

virtual B& getB() { return b; }
};
void A::AB_::fun1() {}

class C : public A {
// Note the use of the typedef, instead of the actual type name.
class CB_ : public A::B {
void fun1() override;
} cb;

public:
typedef CB_ B;

// Note the use of the typedef, instead of the actual type name.
A::B& getB() override { return cb; }
};
void C::CB_::fun1() {}

在这种情况下,C 内部使用了 A 的 typedef,同时替换了它;因此,A 的 typedef 的使用是显式的,如 A::B 而不是 B。由于类型定义,名称 B 将表示 A::AB_C::CB_,当用作 A 时: :BC::B

// If given the above...

int main() {
std::cout << "A::B: " << typeid(A::B).name() << std::endl;
std::cout << "C::B: " << typeid(C::B).name() << std::endl;
}

输出将是:

// GCC:
A::B: N1A3AB_E
C::B: N1C3CB_E

// MSVC:
A::B: class A::AB_
C::B: class C::CB_

关于c++ - 如何在派生类中定义内部类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38110286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com