Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++;FAT文件系统仿真 我现在正在C++中创建一个FAT文件系统。我有三门课: Sdisk(通过字符串到文件输出格式化磁盘) Filesys(写入FAT和根目录) Shell(提供执行各种文件系统操作的能力。)_C++_Shell_Oop_Constructor_Fat - Fatal编程技术网

在C++;FAT文件系统仿真 我现在正在C++中创建一个FAT文件系统。我有三门课: Sdisk(通过字符串到文件输出格式化磁盘) Filesys(写入FAT和根目录) Shell(提供执行各种文件系统操作的能力。)

在C++;FAT文件系统仿真 我现在正在C++中创建一个FAT文件系统。我有三门课: Sdisk(通过字符串到文件输出格式化磁盘) Filesys(写入FAT和根目录) Shell(提供执行各种文件系统操作的能力。),c++,shell,oop,constructor,fat,C++,Shell,Oop,Constructor,Fat,在每个类编码期间,我编写了Sdisk和Filesys构造函数的简单主初始化。现在,当我测试Shell的默认构造函数时,我正在编写Shell,我遇到了内存问题。特别是:EXC\u坏访问(代码=1地址=0xFFFFFFFFFFFFFFFFF….) 我决定使用我的调试器找出哪里出了问题,并确定我在Shell构造函数中传递给Sdisk默认构造函数的值不正确。我开始挖掘,发现在当前类构造函数中调用另一个类构造函数被称为“委托”或“构造函数链接”。我不知道。我发现您必须“从初始化列表中使用它,而不是从构造函

在每个类编码期间,我编写了Sdisk和Filesys构造函数的简单主初始化。现在,当我测试Shell的默认构造函数时,我正在编写Shell,我遇到了内存问题。特别是:EXC\u坏访问(代码=1地址=0xFFFFFFFFFFFFFFFFF….)

我决定使用我的调试器找出哪里出了问题,并确定我在Shell构造函数中传递给Sdisk默认构造函数的值不正确。我开始挖掘,发现在当前类构造函数中调用另一个类构造函数被称为“委托”或“构造函数链接”。我不知道。我发现您必须“从初始化列表中使用它,而不是从构造函数体中使用它”

我为Shell创建了一个没有参数的额外构造函数。我需要做的是使用Sdisk的默认三个参数从Shell构造函数内部调用Sdisk。但当我尝试这样做时,我会继续得到内存错误。我甚至尝试不给Shell的默认构造函数任何参数,但只要我在main中调用它,就会导致错误

非常感谢您对此事的任何帮助!谢谢大家!

类外壳:公共文件系统 { 公众: Shell(字符串文件名,int blocksize,int numberofblocks):Filesys(磁盘){Filesys(文件名,blocksize,numberofblocks);};//创建文件系统。 int dir();//调用列出所有文件的ls int add(字符串文件);//使用键盘输入添加新文件。 int del(字符串文件);//删除该文件 int类型(字符串文件);//列出文件的内容 int copy(stringfile1,stringfile2);//将file1复制到file2 朋友级Sdisk; 朋友类文件系统; }; 类Sdisk { 公众: Sdisk(){} Sdisk(字符串diskname);//默认构造函数 Sdisk(字符串diskname、int numberofblocks、int blocksize); int getblock(int blocknumber、字符串和缓冲区); int putblock(int blocknumber,字符串缓冲区); int getblocksize(){return blocksize;}//返回块大小。 int getnumberofblocks(){return numberofblocks;}//返回块数。 string getfilename(){return diskname;}//返回磁盘名。 朋友级外壳; 朋友类文件系统; 私人: int numberofblocks;//磁盘上的块数 string diskname;//伪磁盘的文件名 字符串diskname1; int blocksize;//块大小(字节)/块数。 }; 类文件系统 { 公众: 文件系统(Sdisk&); int fsclose(); int newfile(字符串文件); int rmfile(字符串文件); int getfirstblock(字符串文件); int addblock(字符串文件,字符串块); int delblock(字符串文件,int blocknumber); int readblock(字符串文件、int blocknumber、字符串和缓冲区); int writeblock(字符串文件、int blocknumber、字符串缓冲区); int nextblock(字符串文件,int blocknumber); 布尔校验块(字符串文件,int blocknumber); 向量块(字符串缓冲区,int b); 磁盘; 朋友级外壳; 私人: int fssync();//将根目录和FAT写入磁盘。 字符串缓冲区; int rootsize;//根目录中的最大条目数 int fatsize;//FAT占用的块数 矢量文件名;//根目录中的文件名 vector firstblock;//根并行中的firstblocks 向量fat;//块的fat }; int main() { 外壳(“磁盘”,256128); 字符串s; string命令=“go”; 字符串op1,op2; while(命令!=“退出”) { command.clear(); op1.clear(); op2.clear(); cout问题在于:

Shell(string filename, int blocksize, int numberofblocks) : Filesys(disk) 
{
   Shell(filename,blocksize,numberofblocks);
};
Shell
构造函数在主体中创建一个临时Shell对象,该对象本身再次调用Shell构造函数,依此类推。因此,最终将得到无限递归和完整堆栈

其他备注:

  • 在shell构造函数中,您还使用mem初始值设定项
    Filesys(disk)
    初始化基类子对象。我在您的代码段中找不到有效的
    disk
    。但由于您遇到运行时问题而不是编译错误,我想它只是在复制和粘贴过程中丢失了

  • 你确定
    Shell
    应该继承自
    Filesys
    ?也就是说,你的Shell是一个FAT文件系统吗?如果以后你决定用NTFS或EXT3文件系统来丰富Shell支持的文件系统,你的类设计会如何发展

  • 最后,块的数量和块大小不是文件系统的参数,而是您在其顶部构造的shell的参数吗

出于这些原因,我宁愿选择以下方式:

class Shell
{
    string fname; 
    Filesys &fs;  
public:    
    Shell(string filename, Filesys &filesystem) 
        : fname(filename), fs(disk)
    { ... };                // creates the file system.
    ...
};
在本例中,您将创建Shell:

Sdisk mydisk("drive1", 32768, 4096);  // disk data for the disk constructor
Filesys mysystem(mydisk);             // fs parameters for the fs
Shell myshell("A:", mysystem);        // higher level abstraction 

我希望我没有弄错。您的代码中有很多问题。正如我在评论中所说,这非常糟糕:

Shell(string filename, int blocksize, int numberofblocks):Filesys(disk) {
   Shell(filename,blocksize,numberofblocks);
};
这是一个明显的无限递归。您说过需要从
Shell
内部调用
Sdisk
,所以我猜您的意思是:

Shell(string filename, int blocksize, int numberofblocks):Filesys(disk) {
   Sdisk(filename,blocksize,numberofblocks);
};
但是,它对您没有任何帮助。这种语法将创建一个临时的
Sdisk
,它将立即消失。您说过要使用默认参数,但没有提供任何位置

将军
Shell(string filename, int blocksize, int numberofblocks):Filesys(disk) {
   Sdisk(filename,blocksize,numberofblocks);
};