- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在用 C++ 创建一个 FAT 文件系统。我有三个类(class):
在每个类编码过程中,我编写了 Sdisk 和 Filesys 构造函数的简单主要初始化。现在我正在编写 Shell,当我测试 Shell 的默认构造函数时,我遇到了内存问题。具体来说:EXC_BAD_ACCESS(code=1 address=0xfffffffffffffff....)。
我决定使用我的调试器找出问题所在,并确定我在 Shell 构造函数中传递给 Sdisk 默认构造函数的值不正确。我开始挖掘并发现在当前类构造函数中调用另一个类构造函数被称为:“Delegating”或“Constructor Chaining”。我不知道。我发现你必须“从初始化列表中使用它,而不是从构造函数体中使用它”。
我已经为 Shell 创建了一个没有参数的额外构造函数。我需要做的是使用 Sdisk 的默认三个参数从 Shell 构造函数内部调用 Sdisk。但是当我尝试这样做时,我继续出现内存错误。我什至尝试不给 Shell 的默认构造函数任何参数,但只要我在 main 中调用它就会导致错误。
非常感谢有关此事的任何帮助!谢谢!
Here is my reference for Delegating Constructors
class Shell: public Filesys
{
public:
Shell(string filename, int blocksize, int numberofblocks):Filesys(disk) {Filesys(filename,blocksize,numberofblocks);}; // creates the file system.
int dir(); // call ls which lists all files
int add(string file); // add a new file using input from the keyboard.
int del(string file); // deletes the file
int type(string file); //lists the contents of file
int copy(string file1, string file2);//copies file1 to file2
friend class Sdisk;
friend class Filesys;
};
class Sdisk
{
public :
Sdisk() { }
Sdisk(string diskname); // Default Constructor
Sdisk(string diskname, int numberofblocks, int blocksize);
int getblock(int blocknumber, string& buffer);
int putblock(int blocknumber, string buffer);
int getblocksize() {return blocksize; } // Returns the blocksize.
int getnumberofblocks() { return numberofblocks; } // Returns the number of blocks.
string getfilename() { return diskname; } // Returns the disk name.
friend class Shell;
friend class Filesys;
private :
int numberofblocks; // number of blocks on disk
string diskname; // file name of pseudo-disk
string diskname1;
int blocksize; // block size in bytes/the number of blocks.
};
class Filesys
{
public:
Filesys(Sdisk&);
int fsclose();
int newfile(string file);
int rmfile(string file);
int getfirstblock(string file);
int addblock(string file, string block);
int delblock(string file, int blocknumber);
int readblock(string file, int blocknumber, string& buffer);
int writeblock(string file, int blocknumber, string buffer);
int nextblock(string file, int blocknumber);
bool checkblock(string file, int blocknumber);
vector<string> block(string buffer, int b);
Sdisk disk;
friend class Shell;
private :
int fssync(); //writes the Root and FAT to the disk.
string buffer;
int rootsize; // maximum number of entries in ROOT
int fatsize; // number of blocks occupied by FAT
vector<string> filename; // filenames in ROOT
vector<int> firstblock; // firstblocks in ROOT parallel
vector<int> fat; // FAT # of blocks
};
int main()
{
Shell("disk",256,128);
string s;
string command="go";
string op1,op2;
while (command != "quit")
{
command.clear();
op1.clear();
op2.clear();
cout << "$";
getline(cin,s);
unsigned long firstblank = s.find(' ');
if (firstblank < s.length()) s[firstblank]='#';
unsigned long secondblank = s.find(' ');
command=s.substr(0,firstblank);
if (firstblank < s.length())
op1=s.substr(firstblank+1,secondblank-firstblank-1);
if (secondblank < s.length())
op2=s.substr(secondblank+1);
if (command=="dir")
{
cout << "dir" << endl;
// use the ls function
}
if (command=="add")
{
// The variable op1 is the new file
cout << "add" << endl;
}
if (command=="del")
{
cout << "del" << endl;
// The variable op1 is the file
}
if (command=="type")
{
cout << "type" << endl;
// The variable op1 is the file
}
if (command=="copy")
{
cout << "copy" << endl;
// The variable op1 is the source file and the variable op2 is the destination file.
}
if (command=="exit")
{
cout << "Exiting now..." << endl;
return 0;
}
}
return 0;
}
Filesys::Filesys(Sdisk& sdisk):Sdisk(disk)
{
this-> disk = sdisk;
rootsize = disk.getblocksize()/12;
fatsize = (disk.getnumberofblocks()*5) / (disk.getblocksize())+1;
cout << "rootsize: " << rootsize << endl << "fatsize: " << fatsize << endl << "number of blocks: " << disk.getnumberofblocks() << endl << "getblocksize(): " << disk.getblocksize() << endl;
for(int i=0; i<rootsize; i++)
{
filename.push_back("XXXXXX");
firstblock.push_back(0);
}
int k= disk.getnumberofblocks();
fat.push_back(fatsize + 2);
for (int i = 0; i <= fatsize; i++)
{
fat.push_back(0);
}
for(int i = fatsize + 2; i < k; i++)
{
fat.push_back(i+1);
}
fat[fat.size()-1] = 0;
fssync();
}
Sdisk::Sdisk(string disk)
{
diskname = disk + ".dat";
diskname1 = disk + ".spc";
ifstream ifile(diskname1.c_str());
if(ifile.is_open())
{
ifile >> numberofblocks >> blocksize;
ifile.close();
}
else
{
cout << "Was unable to open the file" << endl;
}
}
// Sdisk default constructor
Sdisk::Sdisk(string disk, int numberofblocks, int blocksize)
{
this->diskname = disk + ".dat";
this->diskname1 = disk + ".spc";
this->numberofblocks = numberofblocks;
this->blocksize = blocksize;
fstream spcfile;
fstream datfile;
spcfile.open((this->diskname1).c_str(),ios::in | ios::out);
datfile.open((this->diskname).c_str(),ios::in | ios::out);
if (spcfile.good() && datfile.good())
{
cout << "The disk named: " << diskname.c_str() << " exists and is now ready to be written to." << endl;
}
else // .spc/.dat file creation.
{
cout << "The disk: " << diskname.c_str() << "could not be found. " << endl;
cout << "Both the SPC and DAT file were not found. Creating both now. Please wait...." << endl;
spcfile.open((this->diskname1).c_str(),ios::out);
datfile.open((this->diskname).c_str(),ios::out);
spcfile << numberofblocks << " " << blocksize;
cout << "The SPC file " << diskname.c_str() << " was created" << endl;
cout << "The DAT file " << diskname.c_str() << " was created" << endl;
for (int i=0; i<numberofblocks*blocksize; i++)
{
datfile.put('#'); // Fills the file with '#' character.
}
}
spcfile.close();
datfile.close();
return;
}
最佳答案
问题出在这里:
Shell(string filename, int blocksize, int numberofblocks) : Filesys(disk)
{
Shell(filename,blocksize,numberofblocks);
};
Shell
构造函数在主体中创建一个临时 shell 对象,它本身再次调用 Shell 构造函数,依此类推。所以你最终会得到一个无限递归和一个完整的堆栈。
其他备注:
在您的 shell 构造函数中,您还使用 mem-initializer Filesys(disk)
初始化了基类子对象。我在您的代码片段中找不到有效的 disk
。但是当您遇到运行时问题而不是编译错误时,我想它只是在复制和粘贴过程中丢失了。
您确定 Shell
应该继承自 Filesys
吗? IE。你能说你的 Shell 是一个 FAT 文件系统吗?如果稍后您决定使用 NTFS 或 EXT3 文件系统来丰富您的 Shell 支持的文件系统,您的类设计将如何发展?
最后, block 数和 block 大小不是文件系统的参数,而不是您在其顶部构建的 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
关于c++ - 在 C++ FAT 文件系统仿真中使用继承委派构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279684/
我正在用 C 实现 FAT 文件系统。我遵循 microsoft 发布的规范 ( http://read.pudn.com/downloads77/ebook/294884/FAT32%20Spec%
我正在尝试从具有 armv6 和 armv7 架构的库中删除重复对象,即, $ lipo -info libx.a Architectures in the fat file: libx.a are:
我正在学习 FAT 文件系统以及如何计算 FAT 大小。现在,我有这个问题: 假设磁盘大小为 32 MB,块大小为 1 KB。计算FAT16的大小。 现在,我知道要计算它,我们将每个条目的位数乘以块数
我正在使用 Chan's FAT library这似乎提供了一个标准的 FAT 文件系统 API。 API 似乎没有直接提供列出给定目录中的所有文件。 列出可以访问标准 FAT API 的目录中所有文
我有一个数据库实现,每条记录一个文件,我有大约 10000 条记录。我正在尝试优化访问文件的性能,但我有点怀疑。 将文件拆分到文件夹中是否比将所有文件保存在单个文件夹中更好,以便快速访问文件?例如:文
我需要用 C 创建我自己的文件系统实现。我正计划创建一个类似于 FAT 系统的系统。我们得到一个大小为 10MB 的文件,它充当我们自己的“磁盘”。我知道 FAT 表存储簇号,根目录存储我们创建的每个
我正在尝试使用自定义引导加载程序开发一个小型操作系统。我在 OSDEV 方面有一点经验,但没有那么多......我的问题是第一阶段引导加载程序没有从磁盘加载秒数。这是 boot.asm 文件: org
最近在处理我的代码时,我注意到一些内存使用量显着增加,我在我的代码中看不到很多原因。所以我想知道是否有任何程序、技术或其他类型的工具可以扫描我的代码(Delphi)并为我估计哪些过程、函数和函数将是最
我知道这个问题已经被提出过多次,但我的目标与我在网上搜索到的内容略有不同。具体来说,我已经能够为 iPhone 构建静态库,但我能够构建的最终 fat 文件仅包含 arm 和 i386 架构(并且我不
我已经在几个上下文中阅读过“胖指针”这个术语,但我不确定它的确切含义以及它何时在 Rust 中使用。指针似乎是普通指针的两倍,但我不明白为什么。它似乎也与特征对象有关。 最佳答案 术语“胖指针”用于指
因此,我正在翻译示例代码,该示例代码说明如何使用Gradle从GroovyDSL到KotlinDSL创建胖子(我正在使用Gradle 5.3.1)。 我得到了GroovyDSL代码here: jar
我的 CPU 是小端字节序,文档告诉我它符合 FAT 规范的字节顺序。那么为什么我得到了 BS_jmpBoot 的有效地址(第一个扇区的字节 0-3),却没有得到 BPB_BytesPerSec 的有
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我正在寻找一种方法来纯粹外部化 Spring boot 应用程序中的一些配置设置。例如:当双击 fat-JAR 文件时,它会从中加载配置,例如 myConfig.config,该文件与 fat-JAR
当涉及到使用 FAT 的文件系统时,这里出现了一个关于随机访问的直截了当的问题。 我看到了不同种类的图片/动画对 FAT 的不同解释,展示了不同的东西。我不明白如何在不通过文件一次的情况下进行随机访问
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我正在编写一个嵌入式系统,其中我正在创建一个 USB 大容量存储设备驱动程序,该驱动程序使用 8MB RAM block 作为 FAT 文件系统。 尽管当时允许操作系统将我的 RAM 区域清零并格式化
这个问题在这里已经有了答案: ECMAScript 6 arrow function that returns an object (6 个答案) 关闭 5 年前。 是否可以将下面的代码写在一行中(
我正在尝试使用这些说明在 Windows 上安装无脂 crm http://guides.fatfreecrm.com/Setup-Microsoft-Windows.html 我正在安装mysql2
我已经在多个上下文中读到术语“胖指针”,但我不确定它的确切含义以及它在 Rust 中的使用时间。指针好像是普通指针的两倍大,但我不明白为什么。它似乎也与特征对象有关。 最佳答案 术语“胖指针”用于指代
我是一名优秀的程序员,十分优秀!