相关疑难解决方法(0)

为什么虚拟析构函数?

我正在浏览一些代码,计划将其用于我的研究.所以头文件看起来像这样

#ifndef SPECTRALCLUSTERING_H_
#define SPECTRALCLUSTERING_H_

#include <vector>
#include <eigen3/Eigen/Core>

class SpectralClustering {
public:
    SpectralClustering(Eigen::MatrixXd& data, int numDims);
    virtual ~SpectralClustering();

    std::vector<std::vector<int> > clusterRotate();
    std::vector<std::vector<int> > clusterKmeans(int numClusters);
    int getNumClusters();

protected:
    int mNumDims;
    Eigen::MatrixXd mEigenVectors;
    int mNumClusters;
};

#endif /* SPECTRALCLUSTERING_H_ */
Run Code Online (Sandbox Code Playgroud)

后者在主代码中

#include "SpectralClustering.h"
#include <eigen3/Eigen/QR>

SpectralClustering::SpectralClustering(Eigen::MatrixXd& data, int numDims):
    mNumDims(numDims),
    mNumClusters(0)
Run Code Online (Sandbox Code Playgroud)

所以我不明白为什么在.h文件中使用虚拟析构函数.从这个我们可以得知,虚析构函数是有用时,你可以通过指针删除派生类的实例,立足class.But我想,这是不是跟这个code.Can有人区分解释这一切?

c++ inheritance virtual-destructor

1
推荐指数
1
解决办法
1595
查看次数

派生类析构函数发生了什么?

这是我试图理解输出的代码.

class A
    {
    public:

        A();
        ~A(){ cout<<"Destructor Called from A"<<endl;}
        A(int x):Z(x){ cout<<"Constructor Called from A"<<endl; };

    private:
        int Z;
    };

    class B:public A
    {
    public:

        B();
        ~B(){ cout<<"Destructor Called from B"<<endl;}
        B(int x):A(x),Y(x){ cout<<"Constructor Called from B"<<endl; };

    private:
        int Y;
    };

    int main() {

        A *a = new B(10);        
        delete a;

        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

为此,我得到了输出

Constructor Called from A
Constructor Called from B
Destructor Called from A
Run Code Online (Sandbox Code Playgroud)

我的问题是,类的析构函数发生了什么B?对象切片是否在这里起作用?

c++ visual-c++

0
推荐指数
1
解决办法
43
查看次数

'在构造函数/ Desconstructor的情况下'未定义对vtable的引用'

当我用c ++ 11和发布模式练习clang ++中的多态时,我得到了2个'对vtable的未定义引用'的错误.以下是我的代码的一些部分.

#include <armadillo>
typedef float CHOSENONE;
typedef std::vector<std::vector<CHOSENONE> > fVect2d;
typedef std::vector<CHOSENONE> fVect;
class CfSubSet {
    private:
        fmat m_Data;
        frowvec m_Label;
        int m_NumInstances, m_NumFeatures ;
    public:
        CfSubSet(){
            cout<<"hello! \n" <<endl;
            m_NumInstances = 0;
            m_NumFeatures = 0;
            m_Data.zeros();
            m_Label.zeros();
        }
        CfSubSet(int iNumInstances, int iNumFeatures):m_NumInstances(iNumInstances),m_NumFeatures(iNumFeatures){
            m_Data.resize(iNumInstances,iNumFeatures);
            m_Label.resize(iNumInstances);
        }
        ~CfSubSet(){
            m_Data.reset();
            m_Label.reset();
        }
        inline int getNumInstances(){return m_NumInstances;};
        inline int getNumFeatures(){return m_NumFeatures;};
        inline fmat& getData(){return m_Data;};
        inline fmat& getLabel(){return m_Label;};
};

class CData
{
    protected:
        CfSubSet * m_Test;
        CfSubSet * m_Train; …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism inheritance c++11

0
推荐指数
1
解决办法
676
查看次数

未定义的对象错误引用

#include <iostream>
#include <string>
using namespace std;

class Part{
public:
    std::string spec;
    Part(std::string str){
        this->spec = str;
    }
    std::string getSpec(){
        return spec;
    }
};

class Car{
public:
    Part getEngine();
    Part getWheels();
    Part getBody();
};


class Benz:public Car{
public:
    Part getEngine(){
        return Part("Benz Engine");
    }   
    Part getWheels(){
        return Part("Benz Wheels");
    }
    Part getBody(){
        return Part("Benz Body");
    }
};

class Audi:public Car{
public:
    Part getEngine(){
        return Part("Audi Engine");
    }   
    Part getWheels(){
        return Part("Audi Wheels");
    }
    Part getBody(){
        return Part("Audi Body");
    }
}; …
Run Code Online (Sandbox Code Playgroud)

c++ oop abstract-class class

0
推荐指数
2
解决办法
764
查看次数

覆盖'virtual void'c ++错误

以下代码给我一个错误。

错误:覆盖了'virtual void Animal :: getClass()',其中说virtual void getClass(){cout <<“我是动物” << endl; }

错误:为'virtual int Dog :: getClass()'指定的返回类型冲突,它说getClass(){cout <<“我是狗” << endl; }

另外,它说:

“狗”类具有虚拟方法“ getClass”,但非虚拟析构函数

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include<sstream>
#include <stdlib.h>     // srand, rand
#include <stdio.h>

using namespace std;

class Animal{

public:
    void getFamily(){ cout << "We are animals " << endl;}

    virtual void getClass() { cout << "I'm an animal" << endl; }
};

class Dog : public Animal{

public:
    getClass(){ cout << "I'm a …
Run Code Online (Sandbox Code Playgroud)

c++ virtual-functions

0
推荐指数
1
解决办法
1237
查看次数

只创建一个对象,Destructor仍被调用2次.为什么?

#include<bits/stdc++.h>
using namespace std;
class A {

 public :
     ~A(){
    cout << " A is destroyed " << endl;
    }
};

class B : public A
{

 public :
     ~B(){
         cout << " B is destroyed " << endl;
    }
};
int main()
{
    B obj;
    B * p = &obj;
    delete p;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在main函数中,我创建了一个 B类对象,它继承了A类.当我使用指针删除该对象时,析构函数被调用并打印消息然后,我无法理解为什么析构函数被调用两次

c++

0
推荐指数
1
解决办法
87
查看次数

虚拟析构函数与RAII一起使用

我的问题如下:以下代码是否正确:

class A {}; // no virtual destructor

class B : public A{
    std::unique_ptr<int> ptr{new int(5)};
};

// in main
std::unique_ptr<A> = new B;
Run Code Online (Sandbox Code Playgroud)

它可能会有一些编译错误,但只是理解这个概念.指针是否会被正确删除(我的意思是ptr会被删除吗?)或者我们是否需要虚拟析构函数来确保它

c++

0
推荐指数
1
解决办法
50
查看次数

我想知道为什么在继承中调用析构函数时出错

#include<iostream>
using namespace std;

class A
{
public:
   A() { cout << "A Creator" << endl; }
   ~A() { cout << "A Destroyer" << endl; }
};

class B : public A
{
public:
    B() { cout << "B Creator" << endl; }
    virtual ~B() { cout << "B Destroyer" << endl; }
};

void main()
{
    A* temp = new B;
    delete temp;
}
Run Code Online (Sandbox Code Playgroud)

错误截图

我不确定我认为这是我的想法.我当然想知道为什么错误发生了.

temp分配派生类B并将其存储在指针类型(基类A)中.

此时,编译器基于指针数据类型.

未创建虚函数表,因为基类析构函数没有虚拟声明.

B类创建一个虚函数表.还创建了虚函数表指针.

当试图破坏temp时,temp调用指针数据类型析构函数并发出问题.

 

无法找到B类虚函数表指针.

这是因为指针数据类型是非虚基类.

c++ virtual pointers destructor c++11

0
推荐指数
1
解决办法
84
查看次数

内存泄漏和字符串我有一个非常奇怪的问题

当我分配几乎相同的类但有一个成员变量为字符串而不是整数时,我有内存泄漏的问题.

带有字符串的类会产生内存泄漏,但不会产生整数.我删除了我可以删除的所有内容,但我仍然得到内存泄漏请帮忙.

所以soundbook类给我内存泄漏我不知道为什么因为我已经分配任何东西,但当我删除字符串成员我不再得到内存泄漏为什么会发生这种情况?

//主要

#include <iostream>

#include "PappersBok.h"
#include "SoundBook.h"

int main()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    Books *bk[5];

    bk[0] = new SoundBook();
    bk[1] = new PappersBok();
    bk[2] = new PappersBok();
    bk[3] = new PappersBok();
    bk[4] = new PappersBok();

    for (int i = 0; i < 5; i++)
    {
        delete bk[i];
    }


    system("pause");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

// soundbook类.h和.cpp

#ifndef SOUNDBOOK_H
#define SOUNDBOOK_H


#include "books.h"

class SoundBook : public Books
{
private:
    std::string medium;
public:
    SoundBook(std::string title = "?", std::string author = …
Run Code Online (Sandbox Code Playgroud)

c++ memory-leaks

0
推荐指数
1
解决办法
111
查看次数

有一个 C++ 变量可以是 Class Foo 或 Class Bar

我有兴趣编写一个打印机来输出两种不同的格式。我们称它们为 txt 和 csv。

可以在 C++ 中实现类似下面的内容吗?

class Printer {
public:
  virtual void header() = 0;
};

class CSV : Printer {
public:
 void header() { printf("csv\n"); }
};

class TXT : Printer {
public:
 void header() { printf("txt\n"); }
};

int decider(int type) {
  auto prt;
  if (type == 1) {
     prt = new CSV;
  } else {
     prt = new TXT;
  }
  prt.header();
}
Run Code Online (Sandbox Code Playgroud)

如果没有,有什么替代方法可以做类似的事情?

c++ c++11

-1
推荐指数
1
解决办法
65
查看次数

在C++中使用虚拟析构函数(除了解构顺序正确性)

每个C++程序员都知道,虚拟析构函数用于确保继承层次结构中对象的正确销毁顺序.

在哪里使用"虚拟析构器"/可以在实时场景中使用?

c++ virtual virtual-destructor

-2
推荐指数
1
解决办法
96
查看次数

为什么我们需要一个具有动态内存的虚拟析构函数?

当我们有继承时,为什么我们需要一个带有动态变量的虚拟析构函数?在静态/动态情况下析构函数的执行顺序是什么?最底层派生类的析构函数不会总是先执行吗?

c++ virtual-destructor

-3
推荐指数
1
解决办法
614
查看次数