无法引用函数(隐式声明)-它是已删除的函数

时间:2019-04-29 02:11:16

标签: c++

主程序:

#include <stdlib.h>
#include <iostream>
#include "AdjacencyMatrix.h"

void Prim(Matrix*, int*, int);
int minVertex(Matrix*, int*);

int main() {
    Matrix M(6);
    int weight = 0;
    Prim(M,weight,0);
    system("pause");
    return 0;
}
void Prim(Matrix*G, int*D, int s) { // Prim’s MST algorithm
int VISITED = 1;
int UNVISITED = 0;
int V[6];                 // Store closest vertex
int i, w;
for (int i=0; i<G->n(); i++)       // Initialize
    D[i] = INFINITY;
D[s] = 0;
for (i=0; i<G->n(); i++) {         // Process the vertices
    int v = minVertex(G, D);
    G->setMark(v, VISITED);
    //if (v != s)
    //  AddEdgetoMST(V[v], v);         // Add edge to MST
    if (D[v] == INFINITY) return;    // Unreachable vertices
    for (w=G->first(v); w<G->n(); w = G->next(v,w))
        if (D[w] > G->weight(v,w)) {
            D[w] = G->weight(v,w);       // Update distance
            V[w] = v;                    // Where it came from
        }
    }
}

这是Matrix类及其构造函数和析构函数:

#pragma once
#include <assert.h>
#include "GraphADT.h"

class Matrix : public Graph {
private:
    int numVertex, numEdge; // Store number of vertices, edges
    int**matrix;           // Pointer to adjacency matrix
    int*mark;              // Pointer to mark array
    int VISITED = 1;
    int UNVISITED = 0;
public:
    Matrix (int numVert) { Init(numVert); } 
    ~Matrix() {       // Destructor
        delete [] mark; // Return dynamically allocated memory
        for (int i=0; i<numVertex; i++)
            delete [] matrix[i];
        delete [] matrix;
    void Init(int n) { // Initialize the graph
        int i;
        numVertex = n;
        numEdge = 0;
        mark = new int[n];     // Initialize mark array
        for (i=0; i<numVertex; i++)
            mark[i] = UNVISITED;
        matrix = (int**) new int*[numVertex]; // Make matrix
        for (i=0; i<numVertex; i++)
            matrix[i] = new int[numVertex];
        for (i = 0; i < numVertex; i++)  // Initialize to 0 weights
            for (int j = 0; j < numVertex; j++)
                matrix[i][j] = 0;
    }

    int n() { return numVertex; } // Number of vertices
    int e() { return numEdge; }   // Number of edges

    // Return first neighbor of "v"
    int first(int v) {
        for (int i=0; i<numVertex; i++)
            if (matrix[v][i] != 0) return i;
        return numVertex;           // Return n if none
    }

    // Return v’s next neighbor after w
    int next(int v, int w) {
        for(int i=w+1; i<numVertex; i++)
            if (matrix[v][i] != 0)
                return i;
        return numVertex;           // Return n if none
    }
    // Set edge(v1, v2) to "wt"
    void setEdge(int v1, int v2, int wt) { 
        assert(wt>0, "Illegal weight value"); 
        if (matrix[v1][v2] == 0) numEdge++;
        matrix[v1][v2] = wt; 
    }

    void delEdge(int v1, int v2) { // Delete edge (v1, v2)
        if (matrix[v1][v2] != 0) numEdge--;
        matrix[v1][v2] = 0;
    }

    bool isEdge(int i, int j) // Is (i, j) an edge?
    { return matrix[i][j] != 0; }

    int weight(int v1, int v2) { return matrix[v1][v2]; }
    int getMark(int v) { return mark[v]; }
    void setMark(int v, int val) { mark[v] = val; }
    }

以下是我忽略的Graph的重要部分:

class Graph {
private:
    void operator =(const Graph&) {}    // Protect assignment
    Graph(const Graph&) {}         // Protect copy constructor
}

Graph的其余部分是纯虚函数。

我在调用Prim函数的行上收到此错误。

完整错误为function "Matrix::Matrix(const Matrix &)" (declared implicitly) cannot be referenced -- it is a deleted function

我一直在寻找答案,但似乎无法理解如何解决此错误。我认为这与构造函数和析构函数有关,但我不知道如何解决该问题。

对于为什么会发生此问题以防止将来出现问题,我也将不胜感激。

此外,Prim算法直接来自我的教科书,不是原始代码。

编辑:包括完整的Matrix类以进行澄清。

1 个答案:

答案 0 :(得分:2)

在@IgorTandetnik的指导下,我意识到我需要以除值之外的其他方式将类对象传递给函数。

为此,我更改了

Matrix M(6);
int weights = 0;

到以下

    Matrix m1(6);
    Matrix* M;
    M = &m1;
    int weights = 0;
    int* w;
    w = &weights;

,还将函数调用从Prim更改为

Prim(M,w,0);

这实际上确实解决了原始问题。代码中仍然存在错误,导致weightsm1附近的堆栈损坏,但是由于原始问题已解决,因此问题得到了解决。

编辑:正如本(Ben)在下面的评论中所述,我的问题是Prim试图填充一系列权重。为了解决这个问题,我将权重声明更改为int w[size],大小为顶点数。