2016-09-23 36 views
0

好吧,只是新的类和试图创建一个简单的程序,它有2个类。 A类和B类。嗯,我试图在类A中的构造函数中初始化我的变量,然后做一些动作并将它传递给B类,我也可以做一些动作。所以A类是一个基类。然而,当我编译程序我有两个错误 -C++的构造函数,并将变量传递给另一个类

error: ‘i’ was not declared in this scope

对于A类和B类所以,我有两个问题1)为什么构造函数不声明变量(按称为第一书构造函数)? 2)我可以如何将变量从A类传递到B类中?

#include <iostream> 
#include <cstdio> 
using namespace std; 
class A { 
    public: 
     A(){ 
      int i =1;   
     } 
     ~A(){} 
     int foo() { 
      int p = i+1; 
      i++; 
      return p; 
     } 

}; 

class B : public A { 
    public: 
     int showme() { 
      return i; 
     } 
}; 

int main() { 
    A j; 
    B k; 
    cout<< k.showme()<<endl; 
    cout<< j.foo()<<endl; 
return 0; 
} 
+0

那么我必须在构造函数中声明什么呢?我认为构造函数是声明变量? –

+1

我可能是错的,但它听起来像这也可能有助于指出。在这段代码中,你声明了一个类A的变量和一个单独的B类变量。当你将'int i;'作为A的成员变量添加时,这意味着将会有一个整数j.i和一个不同的整数k.i.我不会称之为成员'A :: i'的相当转移。 –

回答

2

首先,获得一本好书:

The Definitive C++ Book Guide and List

,并与基本熟悉。你的问题表明,在你理解C++的时候现在有一个完整的混乱。

现在到实际的Q's。

1)C-tor不是声明一个类成员变量,它只能声明一个局部变量,因为c-tor也是一个函数。您需要明确声明成员变量,如下所示:

class A { 
    int i; 
public: 
    A(int _i): i(_i) { } 
}; 

2)术语“传输”本身是不正确的。在这种情况下,这两个类位于继承层次结构中,因此变量i由类B继承,并且如果您声明它为protected,那么它将以您的方式访问。功能B::showme()已正确定义。修复第一部分,并且示例正在工作。

3)不要混淆对象。当有A类别的对象声明时,它与AB的另一个对象无关。 jk分享他们自己的私人实例int i(前提是您修复了(a)),并且如果您希望ki的实例等于j的实例,您可以实现一个拷贝构造函数或一对getter/setter函数。

+0

谢谢,我还是有点困惑于构造函数和A(int _i):i(_i){};但它有效,我会找到一本更好的书来更好地理解它。谢谢。 –

+0

@alex_mike这是说'A(int _i){i = _i; }'。 – iksemyonov

+1

@iksemyonov几乎是一条捷径。对于“昂贵”的对象,初始化列表是要走的路,否则你可以使用default-construct plus assign。另外,初始化列表对于引用类成员是强制性的。 – vsoftco

相关问题