所以,我正在阅读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;
}
答案 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
;但是,如果auth
为free()
d或{{1}稍后,你将有一个指向不再包含你的字符串的内存的指针,这很糟糕)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;
我建议阅读很多关于参考和指针的文档! 干杯!