尝试从另一个类对象获取值时出现分段错误

时间:2018-01-21 23:41:49

标签: c++ c++11 dynamic-memory-allocation

我创建了几个类来介绍我的问题。当我尝试从指针位于segmentation fault类的对象中获取数据时,我收到Storage错误。该程序保存First类类型的单个指针,它可以保存FirstChild类对象地址。 FirstChild类继承自First类。

所以,我创建了两个方法来从对象中获取数据。第一个(getNumbers())是返回变量值的虚方法,第二个getNum()正在调用getNumbers()方法。

segmentation fault错误意味着我正在尝试访问我没有访问权限的内存。

但是还有其他方法来获得这些价值观吗?

First.h

#ifndef FIRST_HPP
#define FIRST_HPP

class First {
  protected:
    int x;
  public:
    First(int x);
    virtual ~First();
    virtual int getNumbers();
 }

#endif

First.cpp

#include "First.h"

First::First(int x) : x(x){}
int First::getNumbers(){
  return this->x;
}
First::~First(){}

FirstChild.h

#ifndef FIRST_CHILD_HPP
#define FIRST_CHILD_HPP

class FirstChild : public First {
  private:
   int y;
  public:
    FirstChild(int x, int y);
    virtual int getNumbers();
 }

#endif

FirstChild.cpp

#include "FirstChild.h"

FirstChild::FirstChild(int x, int y) : First(x), y(y){}
int FirstChild::getNumbers() {
 return this->x + this->y; 
}

storage.h定义

#ifndef STORAGE_HPP
#define STORAGE_HPP

#include "First.hpp"

class Storage {
  private:
    First * somePtr;
    int z;

  public:
    Storage(First * ptr);
    int getNum();
 }

#endif

Storage.cpp

#include "Storage.h"

Storage::Storage(First * ptr) {
this->somePtr = ptr;
}

int Storage::getNum(){
 return this->somePtr->getNumbers(); //Segmentation fault (core dumped)
}

的main.cpp

#include <iostream>
#include "First.h"
#include "FirstChild.h"
#include "Storage.h"

int main(){

First * firstPtr;
FirstChild FchObject(10);

firstPtr = &FchObject;

Storage storage(firstPtr);
storage.getNum();  //Segmentation fault

return 0;
}

2 个答案:

答案 0 :(得分:2)

和其他人一样,我不明白这行是如何编译的,因为getNum()in应该需要一个实例:

Storage.getNum();  //Segmentation fault

试试这个:

Storage myStorage(firstPtr);
myStorage.getNum();

答案 1 :(得分:0)

您的代码无法按原样编译,main()中的3个语法错误:

FirstChild FchObject(10);

因为构造函数的签名是FirstChild(int x,int y),所以它必须有两个参数,例如

FirstChild  FchObject(5, 10);

Storage

的变量缺失的正确声明
firstPtr = &FchObject;
Storage  variable_name(firstPtr);

非静态方法的调用需要之前的类实例。操作者:

variable_name.getNum();