基本的C ++函数,我可以使它工作吗?

时间:2011-12-05 16:51:10

标签: c++

所以,我正在阅读Schildt的第三版关于C ++的书,我正在做所有的例子,但我有一些PHP背景,当我尝试了一些东西时,它发生了它不能这样编译。我看到了Schildt的解决方案,所以我会给出我试图做的以及它在书中的表现,我需要知道的是,在那里有什么方法可以调整我的功能吗?

这是我正在尝试的内容

class card {
char author[40];
//char book[30];
int count;
public:
    void store(char *auth,int ct);
    void show();
};
void card::store(char *auth,int ct){
    &author = *auth;

    count = ct;
}
int main(){
    card ob1, ob2;
    ob1.store('Tolkin',10);
    ob2.store('Pratchet',3);
    ob1.show();
    ob2.show();
return 0;
}

这是Schildt的解决方案:

class card {
char author[40];

int count;
public:
    void store(char *auth,int ct);
    void show();
};
void card::store(char *auth,int ct){
    strcpy(author, auth);

    count = ct;
}

4 个答案:

答案 0 :(得分:2)

快速解决方法:

  • 而不是char author[40]使用std::string
  • store(const std::string& auth,int ct)
  • author = auth;std::string有作业运营商)
  • ob1.store("Tolkin",10);(单引号用于char-literals)
  • card::show()一个身体。你现在只有声明。因为show()不会改变card,所以将其设为const成员函数:void show() const;

真正的解决方案(听起来很棒,但是我的认真,善意的建议):

答案 1 :(得分:0)

不是,不。对于card的任何给定实例,author存储在相对于对象其余部分的特定固定内存位置。 (author实际上对象中:如果你std::cout << sizeof(card) << std::endl;,你会看到card是40个字节,因为它包含的是一个数组四十个字符。)&author = ...试图告诉编译器author现在存储在其他地方,但是没有办法告诉编译器,因为你已经承诺{{1存储在author

那就是说,您可以将card的声明更改为真正的指针,而不是数组:

author

然后像这样分配给它:

char * author;

但那不是个好主意。每当你传递一个指针时,你必须跟踪它已经消失的位置,以确保你的所有指针始终有效,并且你永远不会失去指向内存的指针,你需要在以后取消分配。

答案 2 :(得分:0)

我认为这里的基本误解是C / C ++将“char数组”作为字符串处理的方式。 strcpy例程复制字符串的内容,其中=赋值运算符(应用于char)复制单个字符或指向字​​符串的指针。 &author = *auth将查看auth指针,使用*取消引用它,然后在那里找到单个char,然后获取(&)的地址char[]名为author,并尝试将地址更改为char值。

你可以......

  • 使用strcpy复制字符串的内容(但是,在新代码中,不要使用strcpy ,而是使用strncpy!)
  • 存储指向所提供字符串的指针(您的班级中的char* author将被指定为author = auth;但是,如果authfree() d或{{1}稍后,你将有一个指向不再包含你的字符串的内存的指针,这很糟糕)
  • 为您的字符串使用C ++ delete[]()对象而不是C样式std::string,这将更像PHP字符串。可以使用char[]std::string author复制std::string auth

C ++中的字符串处理是一个很大的主题,但你肯定想要很好地理解“事物”和“指针到事物”类型之间的差异......!

此外,在C ++中,必须在字符串周围使用author = auth,并在""周围使用''。但是,C / C ++ char字符串中的“魔力”要少得多;只有""类型转义序列有效(例如,没有\x替换可用)。在Perl / PHP / Bourne / ...中,对于非转义字符串使用"$var",对转义字符串使用'';在C ++中,由于""char / char[]是不同的类型,因此它们使用不同的标点符号。

答案 3 :(得分:-1)

你混淆了一些类型: 当c ++是。

时,不会输入PHP

您无法编译,因为您正在尝试分配指向引用的指针。

&author = *auth;

我建议阅读很多关于参考和指针的文档! 干杯!