为什么我不能在C ++中这样做?

时间:2010-11-05 10:59:52

标签: c++

为什么方法getName()错误?

#include <iostream.h>
#include <string.h>

class People
{
public:
    char* getName();
    void  setName(char* n);

private:
    char* name;
};

void People::setName(char* n)
{
    name = new char(strlen(n));
    strcpy(name,n);
}  

char* People::getName()
{
    return name;   
}

7 个答案:

答案 0 :(得分:7)

因为Class应为class

现在通过编辑,您不会在类定义中声明setName

编译器很挑剔(像我们一样)。为什么不向我们展示编译器告诉你的确切内容。

答案 1 :(得分:2)

因为您公开了对象中私有数据的基础结构。复制并返回。

答案 2 :(得分:2)

这里有几件事。首先,正如伊格纳西奥指出的那样(假设这是你的问题,它有点模糊),我们有私人成员,所以其他类不能随意搞砸他们。我们通过公共接口公开我们想要其他类的内容。

其次,鉴于这是C ++,我强烈建议您使用std::string而不是char*。这是你的班级:

#include <string>

class Person
{
private:
    std::string m_Name;

public:
    const std::string& getName() const {return(m_Name);};    
}; // eo class Person

我们在这做了什么?

1)我们有一个C ++ std::string,可以为我们处理字符串的所有业务。我们不必担心内存分配,缓冲区大小不足,等等。

2)它是私密的,没有人可以搞定它,所以外部的课程不能去:

Person p;
p.m_Name = "hahaha, I just messed with you";

3)为了让我们班级的用户可以访问该名称,我们返回const std::string&。他们可以使用它,看到它,但不能修改它(当然,除非它们const_cast&lt;&gt;它离开了,但我们至少表明了我们的意图)。

4)将getter标记为const。这告诉编译器在调用期间我们不会改变类的任何成员。

我希望无论你的问题是什么,我都会回答。我现在不知道。

答案 3 :(得分:1)

这是完全合法的。你遇到什么错误?

PS 类必须与c中的小写class一样。


您的setName()课程定义中未定义编辑 People

另外,

name = new char(strlen(n));

是错的。你应该这样声明:

name = new char[strlen(n)];

OR

name = new char[255]; //Constant value.

OR

name = malloc(sizeof(char)*strlen*(n));

答案 4 :(得分:1)

如果你修正了Class拼写错误,你可以这样做:它应该是class

当您提出此类问题时,请提供编译错误日志,我们不能说任何有用的内容,但如果您不这样做,请猜测。

答案 5 :(得分:1)

使用

#include <iostream> 
#include <string> 

在包含字符串标题后,使用字符串而不是char。

using namespace std;
class People  
{  
public:  
    string getName();    
private:  
    string name;    
};

从getName返回一个句柄,char指针,私有数据,名称是bad idea

答案 6 :(得分:1)

分配的缓冲区比输入字符串n小一个字节。我想你忘了尾随'\ 0'的空间。