我有一个简单的C ++测试类,其char * operator()
工作正常。
问题是,当我在堆上创建它时,我无法使用它。
test t;
printf(t);
没问题,但是
test *t=new test();
printf(t);
是没有的。除了printf(* t)之外还有什么方法吗?
答案 0 :(得分:4)
隐式转换为char*
可能听起来不错,但相信我,事实并非如此。猜猜为什么std::string
没有。只需编写c_str
方法并致电printf("%s", t->c_str())
即可。或者甚至更好,为您的班级重载operator<<
。如果您向我们展示课程,我们可以帮助您。
答案 1 :(得分:0)
您需要将内存分配给test *t
才能使用它,否则您的指针不会指向任何内存。
你是这样做的:
test * t= new test();
当你完成后,你还必须再次发布它:
delete t;
您尝试使用*t
打印的printf
是什么?它指向的地址,或其成员的某些内容?如果是后者,则应该使适当的操作符超载。
另外,不要在C ++中使用printf
。在std::cout
课程中使用operator<<
并重载test
。
答案 2 :(得分:0)
您可以将堆对象存储为引用,而不是指针。
test *my_heap_object = new test();
test &t = *my_heap_object;
// now you can use 't', as if it was local,
// instead of dereferencing the pointer each time.
printf(t);
t.do_something();
t++;
可以在wikipedia上找到更多解释。
答案 3 :(得分:0)
鉴于您确实需要将一个指针(必须正确初始化,顺便说一下......)转换为char*
,这是不可能的。
您只能在类中为类的值(或引用)实现运算符。有些运算符可以在类之外定义,但是运算符不是(例如,operator+
可以在外部实现,有两个参数)。
鉴于算术运算符可以在类之外实现(operator<<
是算术运算符),您可以实现输出的流运算符,例如std::cout
,甚至指针。
std::ostream & operator <<(std::ostream & o, const test & t) {
return o << t.toString(); // use std::string here, not c-strings!
}
std::ostream & operator <<(std::ostream & o, const test * t) {
return o << t->toString(); // use std::string here, not c-strings!
}