0

我正在尝试实现一个函数类,但出现重新定义错误。我知道这很愚蠢,但是有人可以帮忙吗?

=== 头文件 ===

#ifndef _NS4_h
#define _NS4_h

#include <vector>
#include <list>

namespace NS4{
    class complex{
    double r, i;
    public:
        complex(double a=0, double b=0) : r(a), i(b) {};    
        complex operator+(complex c);
        complex &operator+=(complex c);
        complex &operator=(complex c);
    };

    // function class 
    class Add{      
        complex val;
    public:
        Add(complex c){ val = c; }
        Add(double r, double i) { val = complex(r, i); }
        void operator()(complex& c) const { c += val; } 
    };

    void h(std::vector<complex> &aa, std::list<complex> ll, complex z);
}
#endif 

===部分cpp文件===

using namespace NS4;
void test9()
{

    vector<complex> aa;
    aa.push_back(complex(0,1));
    aa.push_back(complex(0,2));
    aa.push_back(complex(0,3));

    list<complex> ll;
    ll.push_back(complex(1,1));
    ll.push_back(complex(1,2));
    ll.push_back(complex(1,3));

    complex zz(1,1);

    // the following line is not working
    // error C2371: 'zz' : redefinition; different basic types
    Add(zz);  // Add(complex(1,1)) is working.

    h(aa,ll, zz);
}
4

3 回答 3

3

您有一个 Add 类,因此您需要创建它的一个实例,以便调用构造函数。

所以在下面的例子中,a是我们Add类的一个实例。

Add a(zz);
于 2011-09-15T20:53:07.003 回答
2

您可以选择在声明中为变量名加上括号。

int (i);

是相同的

int i;

因此,在您的情况下,您声明了一个名为zztypeAdd的变量,并且一个名为的变量zz已经存在。您可能打算将zz作为参数传递给Add构造函数,但是您应该为变量命名:

Add adder(zz);

但是,我根本看不到该实例在哪里使用。


但是,如果您只想调用构造函数Add而不声明变量,则可以在整个表达式周围加上括号:

(Add(zz)); //just calls Add::Add(Complex);

欢迎使用 C++ ;)

于 2011-09-15T20:58:56.820 回答
1

应该是什么Add(zz)意思?你认为这意味着什么?

Add(zz)实际上是zz类型对象的声明Add,即

Add(zz);

相当于

Add zz;

您之前已经定义zz过,这就是您收到重新定义错误的原因。这里没有惊喜。

如果不知道您想通过那条Add(zz)线做什么,就无法进一步帮助您。

于 2011-09-15T20:54:25.303 回答