Cout 不打印字符串名称(没有显示错误)
Cout isnt printing string name(No errors are showing)
为什么这段代码不打印名字?我在 Animals 构造函数 class 中定义了名称,但是当我在 运行 代码中时,它只是忽略了定义。
动物class:
#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;
}
(这是我的第一个 post,如果我有任何错误,请原谅)
您只是忘记初始化 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:
为避免混淆,我将为 class 成员使用不同的 属性名称 。
例如'name_
'(末尾有下划线)。
建议3:如@Biffen所述,启用所有警告,不要忽略警告。
使用 g++ -Wall -Wextra
编译代码会显示以下警告:
Animals.cpp:7:1: warning: unused parameter ‘name’ [-Wunused-parameter]
Animals::Animals(std::string name)
^
您的构造函数需要初始化数据成员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 }
为避免将来出现类似问题,请在构造函数的主体中包含一个测试输入有效性的函数(即,是否所有数据成员都初始化为合理的值)。
注意:如果打算计算所有实例化的 Animals
对象的数量。
为什么这段代码不打印名字?我在 Animals 构造函数 class 中定义了名称,但是当我在 运行 代码中时,它只是忽略了定义。
动物class:
#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;
}
(这是我的第一个 post,如果我有任何错误,请原谅)
您只是忘记初始化 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:
为避免混淆,我将为 class 成员使用不同的 属性名称 。
例如'name_
'(末尾有下划线)。
建议3:如@Biffen所述,启用所有警告,不要忽略警告。
使用 g++ -Wall -Wextra
编译代码会显示以下警告:
Animals.cpp:7:1: warning: unused parameter ‘name’ [-Wunused-parameter] Animals::Animals(std::string name) ^
您的构造函数需要初始化数据成员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 }
为避免将来出现类似问题,请在构造函数的主体中包含一个测试输入有效性的函数(即,是否所有数据成员都初始化为合理的值)。
注意:如果打算计算所有实例化的 Animals
对象的数量。