【问题标题】:Base class members don't have expected values基类成员没有期望值
【发布时间】:2019-09-23 09:37:42
【问题描述】:

我正在学习 C++,并且是它的初学者。我在理解为什么会出现逻辑错误或运行时错误时遇到了一些麻烦。谁能解释我做错了什么?

我已经知道了一个解决方案,方法是删除类 A 和 B 中的函数并简单地在构造函数中定义它,但如果这是正确的方法,为什么我不能像我所做的那样在其他函数中初始化它?

#include <stdlib.h>
#include<iostream>
using namespace std;

class A
{
  protected:
  int x;
  public:

void Init()
{
  x = 10;
 }
   };

class B
{
protected:
    int x;
public:

     void Init()
    {
        x = 20;
    }
};

class C: public A, public B
{
public:
   void Test()
   {

      cout << "A's x is " << A::x;
      cout << "\nB's x is " << B::x;
   }
};

int main()
{
    C c;
    c.Test();
    return 0;
}

我期待一个正常的结果,我通常会在 java 中使用“this”函数获得。

A's x is 10
B's x is 20

但我得到的是

A's x is 8
B's x is 50

【问题讨论】:

  • Init 不是构造函数的名称,它只是一个类。构造函数的命名与类的命名相同,即。 class A { A() { ... this will run at constructiong ... } };

标签: c++ operators logical-operators


【解决方案1】:

A::Init()B::Init() 都没有被调用。 A::xB::xuninitialized

【讨论】:

  • 我明白了,谢谢您澄清这一点,但是为什么输出如此不稳定? 8 和 50?
  • 阅读 C++ 中未初始化的变量。我添加了指向我的答案的链接。
【解决方案2】:

在 C++ 中,您应该为您的类提供默认构造函数。 对于要存储在 std::vector 等 STL 容器中的类,还需要默认构造函数。

可能在 Java 中,编译器会代表您执行此操作,并且您的代码可以正常工作。

无论如何,在特定情况下,您应该初始化两个基类调用

A::Init();
B::Init();

在调用派生的 c.Test() 之前。

class C : public A, public B
{
   public:
   void Test()
    {
       A::Init();
       B::Init();
       cout << "A's x is " << A::x;
       cout << "\nB's x is " << B::x;
    }
};


   //output
   A's x is 10
   B's x is 20

问候

【讨论】:

    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2023-04-07
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多