странная ошибка компиляции основного модуля с использованием g ++ - PullRequest
2 голосов
/ 02 февраля 2012

Я пытаюсь скомпилировать приведенный ниже код, используя "g ++ main.cpp -c", но он дает мне эту странную ошибку ... какие-либо идеи?

main.cpp: In function ‘int main()’:
main.cpp:9:17: error: invalid conversion from ‘Graph*’ to ‘int’
main.cpp:9:17: error:   initializing argument 1 of ‘Graph::Graph(int)’
main.cpp:10:16: warning: deprecated conversion from string constant to ‘char*’

Это мой основной модуль, который я пытаюсьчтобы скомпилировать и ниже это класс графа, который у меня есть в graph.hpp

#include <iostream>
#include "graph.hpp"

using namespace std;

int main()
{
  Graph g;
  g = new Graph();
  char* path = "graph.csv";
  g.createGraph(path);
  return 0;
}

И это мой класс графа

    /*
 * graph.hpp
 *
 *  Created on: Jan 28, 2012
 *      Author: ajinkya
 */

#ifndef _GRAPH_HPP_
#define _GRAPH_HPP_

#include "street.hpp"
#include "isection.hpp"
#include <vector>

class Graph
{
 public:
  Graph(const int vertexCount = 0);
  //void addIsection(Isection is);
  //void removeIsection(int iSectionId);
  Isection* findIsection(int);
  void addStreet(int iSection1, int iSection2, int weight);
  void createGraph(const char *path); //uses adj matrix stored in a flat file
  //void removeStreet(int streetID);
  void printGraph();
  ~Graph();
 private:
  //Isection *parkingLot;
  //Isection *freeWay;
  int** adjMatrix;
  std::vector <Street*> edgeList;
  std::vector <Isection*> nodeList;
  int vertexCount;
};

    #endif

Ответы [ 4 ]

5 голосов
/ 02 февраля 2012

Это C ++, а не Java или C #. new здесь не работает так же.

new выражения возвращают указатели. Вы не можете назначить указатель на Graph (т.е. Graph*) на переменную типа Graph:

Graph g;
g = new Graph(); // Graph = Graph* ? nope

Похоже, что компилятор пытается быть "полезным" и пытается использовать ваш конструктор, принимает аргумент int для получения значения типа Graph, но он не может преобразовать Graph* в int.

Когда вы пишете Graph g;, у вас уже есть Graph объект . Вам не нужно создавать один с new. На самом деле, вы, вероятно, даже не хотите сделать это, поскольку это приведет к утечкам памяти .

Тогда есть эта строка:

char* path = "graph.csv";

"graph.csv" имеет тип char const[10], поэтому вам не следует присваивать его char*. В прошлом вы могли, но это оказалось плохой идеей. Эта функция была помечена как устаревшая, и теперь она была полностью удалена в C ++. Вместо этого вы можете:

2 голосов
/ 02 февраля 2012

Это, вероятно, должно быть g = Graph(); и забыть g = new Graph;.Причина в том, что new возвращает указатель на созданный объект (например, Graph*), а не значение объекта.

Еще лучше, просто выполните Graph g; и забудьте оприсвоение чего-либо g.Это автоматически создаст для вас Graph, вызвав конструктор Graph без аргументов.

0 голосов
/ 02 февраля 2012

Прежде всего new Graph() возвращает Graph*. В c ++ конструктор с одним аргументом может вызываться неявно, поэтому в настоящее время ваш код действительно имеет значение:

g = Graph(new Graph());

То, что вы хотите, это

g = Graph();
0 голосов
/ 02 февраля 2012

Graph* g;

Это должен быть указатель.

...