我得到变量 a 的垃圾值。我必须输入 2 个值并使用 2 个类 - 基类和派生类打印它们的总和

Posted

技术标签:

【中文标题】我得到变量 a 的垃圾值。我必须输入 2 个值并使用 2 个类 - 基类和派生类打印它们的总和【英文标题】:I am getting a garbage value for variable a. I have to input 2 values and print their sum using 2 classes- base and derived 【发布时间】:2021-02-01 18:31:39 【问题描述】:

这是一个 C++ 中的单继承程序。我必须使用 protected 关键字派生一个类。 在第一个类 A 中,我声明了 2 个函数来输入和存储整数变量 a 的值。 创建派生类后,我想打印为变量 a 和 b 输入的值,然后在屏幕上显示它们的总和。我正确地得到了 b 的值,但是我得到了 a 的垃圾值。有人可以帮助我并告诉我哪里出错了吗?

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

class A

 protected:
       int a;
 public:
    void input_val_a(int);
    int ret_a();
    
;

class B:protected A

 int b,c;
 public:
    void input_val_b(int);
    void get_a();         
    void sum();
    void display_value();

;

void A::input_val_a(int y)

 a=y;


int A::ret_a()

 return a;



void B::input_val_b(int x)

 b=x;


void B::sum()

 c=ret_a()+b;


void B::get_a()

 int a=ret_a();


void B::display_value()

 cout<<"Value of a="<<ret_a()<<endl;
 cout<<"Value of b="<<b<<endl;
 cout<<"Value of c="<<c<<endl;


int main()

 int a,b;
 B obj;
 A obj1;
 cout<<"Enter the value of a"<<endl;
 cin>>a;
 cout<<"Enter the value of b"<<endl;
 cin>>b;
 obj.input_val_b(b);
 obj1.input_val_a(a);
 obj.get_a();
 obj.sum();
 obj.display_value();

 getch();
 return 0;

【问题讨论】:

int a=ret_a(); in void B::get_a() 仅更改局部变量。换会员a应该是a=ret_a();吗? 此外,您正在对obj 执行所有操作,除了在obj1 上调用的input_val_a。所以obj1.a 被设置为某个值,但obj.a 仍然未初始化。关于我的第一条评论:get_a 没有任何意义,它基本上是a = a。我不太确定你打算对所有类和函数做什么,最好花点时间回顾一下你应该做什么以及真正需要哪些函数。 【参考方案1】:

当您创建两个对象实例时,除非它们共享相同的内存位置,否则它们都是两个独立的对象。这意味着一旦你这样做了,

B obj;
A obj1;

这两个是完全独立的对象。这意味着如果将a 的值分配给obj1obj 中的变量a 将不会改变。而且由于您没有初始化变量,因此您肯定会以垃圾结尾。

我该如何解决这个问题? 它很简单,要么您必须将ab 的值设置为objobj1,或者删除其中一个,大概是obj1(因为您只在创建后调用它一次)。

另一个有效的选项是将a 标记为静态变量。这意味着B::aA::a 指向同一个变量。从一个对象更新它,为所有其他对象更新a 的值。

【讨论】:

以上是关于我得到变量 a 的垃圾值。我必须输入 2 个值并使用 2 个类 - 基类和派生类打印它们的总和的主要内容,如果未能解决你的问题,请参考以下文章

为属性设置默认值并使其可序列化

Python Day7

Perl:组合两个哈希数组的值并使第二个数组的值成为输出哈希的键

用户输入

DateDiff VBA的多个变量

禁用文本框丢失视图状态