初始化值不改变/C++ [关闭]

Posted

技术标签:

【中文标题】初始化值不改变/C++ [关闭]【英文标题】:Initialized values do not change / C++ [closed] 【发布时间】:2021-05-11 19:34:13 【问题描述】:

我正在制作一个打印形状的点和长度的程序。我在子类的构造函数中初始化了点,在 main 中初始化了长度,但它仍然没有显示我设置的初始化值。

这是我的结果: 这是一个形状。它有 0 个点和长度:1.82804e-322 这是一个形状。它有 1 个点和长度:2.102e-317 这是一个形状。它有 -1 点和长度:2.10154e-317

这是我的代码:

#include <iostream>
#include <math.h>
#include <string>
#define pi 3.14159265358979323846

using namespace std;

class Shape 

private:
    int points;
    double length;
    //constructors
protected:
    Shape(int Spoints, double Slength)
    
        Spoints = points;
        Slength = length;
    

public:
    Shape();
    //methods
    string getClass()  return "Shape"; 
    void printDetails()  cout << "This is a " << getClass() << ". It has " << points << " points and length: " << length << "\n"; 
    double getlength()  return length; 
;

class Rectangle : public Shape 
    //constructors
public:
    Rectangle(double Slength)
        : Shape(4, Slength)
    
    

    //getters
    string getClass()  return "Rectangle"; 
    double getArea()  return (getlength() * 2); ;
;

class Triangle : public Shape 
    //constructor
public:
    Triangle(double Slength)
        : Shape(3, Slength);

    //getters
    string getClass()  return "Triangle"; 
    double getArea()  return ((sqrt(3) / 4) * pow(getlength(), 2)); 
;

class Circle : public Shape 
    //consturctor
public:
    Circle(double Slength)
        : Shape(1, Slength)
    
    

    //getters
    string getClass()  return "Circle"; 
    double getArea()  return (pow(getlength(), 2) * pi); 
;

int main()

    Shape* s;
    Rectangle r(2);
    Triangle t(3);
    Circle c(4);

    s = &r;
    s->printDetails();
    s = &t;
    s->printDetails();
    s = &c;
    s->printDetails();
    return 0;
;

【问题讨论】:

你的作业倒退了。 Spoints = points; 应该是 points = Spoints;Slength = length; 应该是 length = Slength;。当前版本通过读取未初始化的值导致未定义的行为。 另外,我希望您为每个对象获得"This is a Shape",而不是"This is a Rectangle""This is a Triangle" 等。如果您需要将getClass() 设为virtual 函数希望它表现出多态性。 是的,这是我项目的下一步。我只是想在继续之前找出错误。 您应该将#define pi 更改为const double pi =。宏没有任何类型安全性。 【参考方案1】:

例如构造函数的主体

protected: Shape(int Spoints, double Slength)
        Spoints = points; 
        Slength = length;
    

没有意义,因为您试图重新分配参数而不是类的数据成员。

你应该写

protected: 
    Shape(int Spoints, double Slength) : points( Spoints ), length( Slength )
    
    

也是这个默认构造函数

Shape();

不初始化数据成员。

还要注意因为函数getClass 不是虚函数没有多态性。你可以像这样声明它

virtual string getClass() const  return "Shape"; 

在其他派生类中,您可以覆盖它,例如

string getClass() const override  return "Rectangle"; 

你还应该将 Shape 类的析构函数设为虚拟

virtual ~Shape() = default;

【讨论】:

以上是关于初始化值不改变/C++ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

c++ 动态数组初始值不为0?

c++ 动态数组初始值不为0?

第二天0707

LigerUI combobox的设置初始值不显示,怎么解决?

JS中的const命令你真懂它吗?

C语言如何改变已经初始化的数组的值