C++ C++;构造函数并将变量传递给另一个类

C++ C++;构造函数并将变量传递给另一个类,c++,class,C++,Class,嗯,只是新的类,并试图创建一个简单的程序,有2个类。类A和类B。我试图在类A的构造函数中初始化我的变量,然后执行一些操作并将其传递给类B,在这里我也可以执行一些操作。所以A类是基类。然而,当我编译程序时,我犯了两个错误- 错误:“i”未在此范围内声明 对于类A和类B,我有两个问题1)为什么构造函数不声明变量(根据名为first的构造函数的书)?2) 我可以用什么方法将变量从类A转移到类B中 #include <iostream> #include <cstdio> usi

嗯,只是新的类,并试图创建一个简单的程序,有2个类。类A和类B。我试图在类A的构造函数中初始化我的变量,然后执行一些操作并将其传递给类B,在这里我也可以执行一些操作。所以A类是基类。然而,当我编译程序时,我犯了两个错误-

错误:“i”未在此范围内声明

对于类A和类B,我有两个问题1)为什么构造函数不声明变量(根据名为first的构造函数的书)?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;
}
#包括
#包括
使用名称空间std;
甲级{
公众:
(){
int i=1;
}
~A(){}
int foo(){
int p=i+1;
i++;
返回p;
}
};
B类:公共A{
公众:
int showme(){
返回i;
}
};
int main(){
A j;
B k;

首先,买一本好书:

P>熟悉基本知识。你的问题表明你对C++的理解有一个完全混乱的状态。

现在来看看实际的Q

1) C-tor不声明类成员变量,它只能声明局部变量,因为C-tor也是一个函数。您需要像这样显式声明成员变量:

class A {
    int i;
public:
    A(int _i): i(_i) {  }
};
2) 术语“传输”本身是不正确的。在这种情况下,这两个类处于继承层次结构中,因此变量
i
由类
B
继承,如果您将其声明为
受保护的
,则可以通过您的方式访问它。函数
B::showme()
定义正确。修复第一部分,示例将开始工作


3) 不要混淆类和对象。当声明了类
A
的对象时,它与类
A
B
j
k
的另一个对象没有任何关系(前提是您修复了(A))共享它们自己的
inti
私有实例如果你想让
k
i
实例与
j
的实例相等,你可以实现一个复制构造函数或一对getter/setter函数。

首先,获得一本好书:

P>熟悉基本知识。你的问题表明你对C++的理解有一个完全混乱的状态。

现在来看看实际的Q

1) C-tor不声明类成员变量,它只能声明局部变量,因为C-tor也是一个函数。您需要像这样显式声明成员变量:

class A {
    int i;
public:
    A(int _i): i(_i) {  }
};
2) 术语“传输”本身是不正确的。在这种情况下,这两个类处于继承层次结构中,因此变量
i
由类
B
继承,如果您将其声明为
受保护的
,则可以通过您的方式访问它。函数
B::showme()
定义正确。修复第一部分,示例将开始工作


3) 不要混淆类和对象。当声明了类
A
的对象时,它与类
A
B
j
k
的另一个对象没有任何关系(前提是您修复了(A))共享它们自己的
inti
私有实例如果你想让
k
i
的实例与
j
的实例相等,你可以实现一个复制构造函数或一对getter/setter函数。

那么我必须在构造函数中声明什么呢?我以为构造函数是声明变量的?我可能错了,但听起来这也可能有帮助o指出。在这段代码中,你声明了一个a类变量和一个单独的B类变量。当你添加
int i;
作为a的成员变量时,这意味着将有一个整数j.i和一个不同的整数k.i。我不会称这是成员
a::i
的完全转移。那么我必须在UC中声明什么呢tor?我以为构造函数是用来声明变量的?我可能错了,但这听起来也可能有助于指出。在这段代码中,您声明了一个a类变量和一个单独的B类变量。当您添加
int I;
作为a的成员变量时,这意味着将有一个整数j.I和一个不同的整数k.I。我不认为这是成员
A::I
的完全转移。谢谢,我仍然对构造函数和A(int\u I):I(\u I){}有点困惑;但它起了作用,我会找到一本更好的书来更好地理解它。谢谢。@alex\u mike这是说
A(int\u I){I=\u I;}的捷径
@iksemyonov几乎是一条捷径。对于“昂贵”的对象,初始化列表是最好的选择,否则默认的构造函数加赋值。另外,初始化列表对于引用类成员来说是必需的。@vsoftco太好了,谢谢,我不知道!构造函数确实很棘手。谢谢,我对构造函数和(int_I):I(_I){;但它奏效了,我会找一本更好的书来更好地理解它。谢谢。@alex_mike这是说
a(int_I){I=_I;}
@iksemyonov的捷径。对于“昂贵”的对象来说,初始化列表是最好的选择,否则默认的构造函数加赋值。另外,初始化列表对于引用类成员是必需的。@vsoftco太好了,谢谢,我不知道!构造函数确实很棘手。