2013-08-01 26 views
0

我知道这可能是一个毫无意义的问题,因为很显然BASE类没有pass_A这个函数,它实际上在另一个类A中声明,而且我使用继承和多态可以让BASE类看到本身和A类型的对象。我绝对希望类型为A的对象能够从BASE以及BASE中调用A类,现在它的方式是init_BASE。我的最终问题是这可能吗?也许我没有使用虚拟或其他的东西是错误的。错误:类“”没有名为“”的成员?是否可以解决这个特定情况?

我想要的是,对象POLY_TYPE能够包含BASEA类类型。 反正heres错误消息和它下面的代码。

EDITED请看解决方案。

+4

Shift组合键到处都在哭泣。 –

+1

pass_A需要是一个虚拟函数,也是以base为基础声明的,通过基本ptr来看 – doctorlove

+0

一个小例子会受到欢迎。用'int'取代'BASE *'会使这个更具可读性。 – MSalters

回答

1

如果这是你需要做的,那么就不要丢弃输入信息,直到你绝对必须:

A<T>* a = new A<T>; 
a->pass_A(new NODE); 
POLY_TYPE = a; 

编辑:

你没有张贴任何错误消息○ ñ你的更新 - 有趣的是,这么多人在这里提出问题相信实际的错误是无关紧要的 - 但你也有类型问题。
由于您将NODE*传递给pass_A,因此模板参数必须为NODE*,而不是NODE

下编译(与无虚函数的版本清理,用我的调整):

class NODE 
{ 
public: 
    NODE(){} 
    ~NODE(){} 
    NODE& operator=(const NODE&) { return *this; } 
}; 

template <class T> 
class A; 

template <class T> 
class BASE 
{  
public: 
    BASE(){} 
    BASE(int mode) 
    { 
     if(mode == 1) 
     { 
      init_BASE(); 
     } 
     else if(mode == 0) 
     { 
      init_A(); 
     } 
    } 
private: 
    void init_BASE() 
    { 
     POLY_TYPE = new BASE<T>; 
    } 

    void init_A() 
    { 
     A<T>* a = new A<T>; 
     a->pass_A(new NODE); 
     POLY_TYPE = a; 
    } 

    BASE* POLY_TYPE; 
}; 

template <class T> 
class A : public BASE<T> 
{ 
public: 
    void pass_A(T DATA) 
    { 
     this->DATA = DATA; 
    } 
private: 
    T DATA; 
}; 

int main() 
{ 
    BASE<NODE*> base(1); 
    return 0; 
} 
+0

不要这行'a-> pass_A(new NODE);'如果我编辑仍然不工作我的第二篇文章与虚拟。你的意思是我的第一篇文章? – pandoragami

+0

没有虚拟,你必须是神或什么... – pandoragami

4

编译器告诉你真相 - BASE确实没有一个名为pass_A的成员。

此处POLY_TYPE->pass_A(new NODE());您正试图通过指向BASE的指针调用pass_A。编译器将根据对象的静态类型(即,BASE而不是动态类型,即为A - 为什么所有的大写字母顺序?)查找方法。

如果你需要这项工作,你需要添加一个virtual pass_A方法到基类。

(我intentionaly离开了的事实,BASE是一个模板 - 类型是真的BASE<T>其中T是任何类型的实例化和模板它不直接相关的问题)

+0

我使用全部大写的类名来区分它们与正常变量。这只是让他们脱颖而出,我并不是在大喊大叫。因此,我只是在'BASE'类中放置了一个'virtual pass_A',并在'A'类中保留了'pass_A'? – pandoragami

+0

@lost_with_coding如果你只使用大写的类名(或类型名),至少你有一定的一致性 - 但是当你创建BASE * POLY_TYPE时你也会毁掉它。并且会以指数方式增加混淆,您甚至可以将此指针称为类型。我敢打赌,你将无法在3个月内维持这样的价格 – nijansen

+0

@lost_with_coding我没有说你在喊叫:)所有大写字母都是在C++中用于宏的常规使用,所以你的风格很不寻常,至少可以说。是的,将'virtual pass_A'放入基类(可选纯虚拟)。它需要与派生类中的签名具有相同的签名。 – jrok

相关问题