Cout没有打印字符串名称(没有显示错误)

时间:2015-10-02 09:10:41

标签: c++ function visual-c++ cout

为什么此代码不会打印名称?我在Animals构造函数类中定义了名称,但是当我运行代码时它只是忽略了定义。

动物类:

#pragma once

#include <vector>
#include <string>

class Animals
{
private:

    std::string name;

    std::vector<int> disgust = {1,3,5};
    std::vector <int> sleepTime = { 1,3,5 };
    std::vector <int> childs = { 1,2,3 };
    std::vector<Animals> theAnimals;

    int disgustBar;
    int sleepBar;
    int animalTotal;

    bool reproduce;

public:
    Animals(std::string name);
    ~Animals();

    void feeding(int i);
    void sleeping(int i);
    void description();
};

Animals.cpp

#include "stdafx.h"
#include "Animals.h"
#include <iostream>

Animals::Animals(std::string name)
{
    disgustBar = 7;
    sleepBar = 7;
}

Animals::~Animals()
{
}

void Animals::feeding(int i)
{
    disgustBar += i;
    return;
}

void Animals::sleeping(int i)
{
    sleepBar += i;
    return;
}

void Animals::description()
{
    std::cout << "The animal name is " + name  << std::endl;
}

主要:

#include "stdafx.h"
#include "Animals.h"
#include <string>
#include <iostream>

int main()
{
    Animals a("Allahu");
    a.description();

    return 0;
}

(这是我的第一篇文章,对不起,如果我犯了任何错误)

2 个答案:

答案 0 :(得分:3)

您只是忘记初始化name成员,执行此操作:

Animals::Animals(std::string name) 
     : name(name) // <- init name
{
    disgustBar = 7;
    sleepBar = 7;    
}

建议1:使用构造函数初始化列表初始化所有成员:

Animals::Animals(std::string name) 
     : name(name), disgustBar(7), sleepBar(7)
{}

相关:Constructor initialization Vs assignment

关于标识符名称的说明:

   : name(name)
//     ^    ^
//     |    +---- Constructor argument
//     +--------- Class member

建议2: 为避免混淆,我会为类成员使用不同的属性名称。 例如“name_”(最后的下划线)。

建议3:如@Biffen所述,启用所有警告,不要忽略警告。

使用g++ -Wall -Wextra编译代码会显示以下警告:

Animals.cpp:7:1: warning: unused parameter ‘name’ [-Wunused-parameter]
 Animals::Animals(std::string name)
 ^

答案 1 :(得分:0)

您的构造函数需要初始化数据成员name

Animals::Animals(std::string n){
    disgustBar = 7;
    sleepBar = 7;
    name = n;
    //---^
}

或者可以修改您的构造函数以初始化所有数据成员,如下所示:

Animals::Animals(std::string n)
   : disgustBar(7), sleepBar(7), name(n) 
{ // body of the constructor }

为避免将来出现类似问题,请在构造函数体中包含一个测试输入有效性的函数(即,所有数据成员是否初始化为合理值)。

注意:您的数据成员animalTotal可能最好被声明为static并在构造函数的主体中递增(在析构函数的主体中递减),如果打算计算数量所有实例化的Animals对象。