从指针调用重载的运算符

时间:2013-01-15 13:15:05

标签: c++ operator-overloading

我有一个简单的C ++测试类,其char * operator()工作正常。 问题是,当我在堆上创建它时,我无法使用它。

test t;
printf(t);

没问题,但是

test *t=new test();
printf(t);

是没有的。除了printf(* t)之外还有什么方法吗?

4 个答案:

答案 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!
}

查看实时http://ideone.com/BZfcji