Множественное определение C ++.Как правильно разделить программу на C ++? - PullRequest
0 голосов
/ 19 января 2012

Я написал программу, которая работает без проблем, но боюсь, что я получаю много предупреждений при компиляции с опцией -Wall (программа написана на C и C ++). На самом деле существует только один тип предупреждений, но он встречается много раз: множественное определение .... (конструкторы, деструкторы и функции). Я думал, что сделал это правильно, но, очевидно, я не прав. У меня 9 файлов:

Server.h     
Server.cpp - implements methods declared in Server.h

RankingCreator.h
RankingCreator.cpp - implements methods declared in RankingCreator.h

Parser.h
Parser.cpp - implements methods declared in Parser.h

PageHandler.h
PageHandler.cpp - implements methods declared in PageHandler.h

и

Main.cpp 

- все заголовочные файлы включены в этот файл, потому что я использую и объединяю функциональность всех классов здесь

Каждый файл .cpp, кроме Main.cpp, содержит только один соответствующий файл .h, например, Server.cpp содержит #include "server.h" и не более .h / .cpp файлов, перечисленных выше (но он содержит заголовки как stdio.h и string.h). Я могу опубликовать здесь целое предупреждающее сообщение и код классов, но длина ошибки составляет около 50 строк, а для всех классов будет около 1000 строк, поэтому скажите, действительно ли это необходимо для решения этой проблемы. Есть идеи, как это решить? Должен ли я сделать каждую функцию встроенной или что-то? Каждый заголовочный файл имеет в начале блок #if def.

EDIT: Вот журнал предупреждений:

g ++ LearnTidyCurl.cpp MyParser.cpp PageHandler.cpp RankingCreator.cpp Server.cpp -lcurl -ltidy -o -Wall Wynik

Вот код одного из моих заголовочных файлов, смотрите путь к ifdefs:

#ifndef RANKINGCREATOR_H_
#define RANKINGCREATOR_H_


#include <stdio.h>
#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>

//using namespace std;

struct rankingElement {
    std::string url;
    int rank;
    bool operator() (rankingElement i, rankingElement j) { return (i.rank >     j.rank);}

}  ;

bool operator==(const rankingElement& elem, const std::string& url);

class RankingCreator {
public:
    rankingElement compareRankingElements;
    const static int MAX_QUERY_RESULT_SIZE = 20;
    RankingCreator();
    virtual ~RankingCreator();
    bool checkPageRank( rankingElement rElement,  std::vector<rankingElement> &ranking );
    void insertIntoRanking( rankingElement rElement,  std::vector<rankingElement>& ranking);

};

#endif /* RANKINGCREATOR_H_ */

Я выбросил предупреждающее сообщение, потому что оно делает эту тему нечитаемой. Btw. Я использую включенные охранники, автоматически сгенерированные Eclipse - разве они не должны быть в порядке? (При создании нового класса они создаются автоматически)

РЕДАКТИРОВАТЬ:

Вы можете скачать файл gedit с журналом ошибок здесь:

http://www4.zippyshare.com/v/62324366/file.html

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

Server.h:

#ifndef SERVER_H_
#define SERVER_H_

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <sstream>
#include <vector> 

...body...

#endif /* SERVER_H_ */

PageHandler.h

#ifndef PAGEHANDLER_H_
#define PAGEHANDLER_H_

#include <tidy.h>
#include <buffio.h>
#include <stdio.h>
#include <errno.h>
#include <iostream>
#include <string.h>
#include <curl/curl.h>
#include <vector>
#include <algorithm>
#include <stdexcept>

... body ...

#endif /* PAGEHANDLER_H_ */

MyParser.h

#ifndef MYPARSER_H_
#define MYPARSER_H_

#include <vector>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <sstream>
#include <algorithm>
#include <queue>
#include <stdlib.h>

...body...

#endif /* MYPARSER_H_ */

main.cpp

#include <stdio.h>
#include <iostream>
#include <queue>
#include "MyParser.h"
#include "PageHandler.h"
#include "RankingCreator.h"
#include "Server.h"

#define NO_ERROR 0

std::string convertIntToString(int input) {

    std::ostringstream ss;
    ss << input;
    std::string tmpStr = ss.str();

return tmpStr;
}

int main(int argc, char **argv) {

... body ...
return 0;
}

MyParser.cpp

#include "MyParser.h"

PageHandler.cpp

#include "PageHandler.h"

server.cpp

#include "Server.h"
* * RankingCreator.cpp тысяча сорок-девять
#include "RankingCreator.h"

Ответы [ 2 ]

1 голос
/ 19 января 2012

Измените охрану включения:

#ifndef FILENAME_H
#define FILENAME_H

//Code

#endif

И держу пари, что твоя проблема исчезнет. Очевидно, убедитесь, что каждый FILENAME_H уникален :) И помните - каждый заголовок нуждается во всем этом коде, но его не должно быть в ваших исходных файлах.

0 голосов
/ 19 января 2012

Напишите свои заголовочные файлы следующим образом:

#ifndef SERVER_H
#define SERVER_H
//...
#endif

Они называются #include guards, чтобы избежать проблем двойного включения. Читайте о них здесь

Если вы когда-либо разрабатывали для MVSC ++, вы можете использовать #pragma once в качестве первой строки каждого заголовка, но первое решение переносимо на любой платформе.

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