C ++ переопределение - PullRequest
       13

C ++ переопределение

0 голосов
/ 16 сентября 2011

Я пытаюсь реализовать класс функций, но получаю ошибку переопределения. Я знаю, что это глупо, но кто-нибудь может помочь?

=== Заголовочный файл ===

#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);
}

Ответы [ 3 ]

3 голосов
/ 16 сентября 2011

У вас есть класс Add, поэтому вам нужно создать его экземпляр, чтобы вызвать конструктор.

Так что в следующем случае a является экземпляром нашего Add класса.

Add a(zz);
2 голосов
/ 16 сентября 2011

Вы можете опционально поместить круглые скобки вокруг имени переменной в объявлении.

int (i);

совпадает с

int i;

Так что в вашем случае вы объявляете переменную с именем zz типа Add, а переменная с именем zz уже существует.Вы, вероятно, намеревались передать zz в качестве аргумента конструктору Add, но тогда вам нужно дать имя переменной:

Add adder(zz);

Однако я не вижу, где этот экземпляр используется ввсе.


Но если вы просто хотите вызвать конструктор Add без объявления переменной, вы можете поместить круглые скобки вокруг всего выражения:

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

Добро пожаловать в C ++;)

1 голос
/ 16 сентября 2011

Что означает Add(zz)?Как вы думаете, что это значит?

Add(zz) фактически является объявлением объекта zz типа Add, т.е.

Add(zz);

эквивалентно

Add zz;

Вы уже определили zz ранее, поэтому вы получаете ошибку переопределения.Здесь нет ничего удивительного.

Нет способа помочь вам в дальнейшем, не зная, что вы пытались сделать с помощью этой линии Add(zz).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...