【问题标题】:Help Setting/Constructing Static Array Size in Classes and Objects in C++帮助在 C++ 中的类和对象中设置/构造静态数组大小
【发布时间】:2011-06-22 00:04:55
【问题描述】:

有一个家庭作业,我认为很简单并且可以不使用类/对象来完成,但我想我只是对类/对象的理解不够好,无法按照老师要求的方式完成它。

所有这些都将通过一个长度始终为 20 的整数数组来完成。

分配调用 3 个单独的文件:

1 个头文件,book.h,包含类元素/成员函数/原型) 1 个 .cpp 文件,包含所有成员函数。为此,我将简单地包含一个示例(1 个 .cpp 文件,该文件仅包含 int main 并充当用户所看到的接口并调用成员函数等。

//book.h
class Shelf{
public:
Shelf();
void insert(int);
int bookshelf[];
};

现在 book.cpp 包含成员函数(我真的不知道我是否需要这样的构造函数,我是否将数组命名为与 book.h 中的数组相同的名称?)

//book.cpp
#include <iostream>  
#include "book.h"
const int shelfSize=20;

Shelf::Shelf(){
    bookshelf[shelfSize];
    for(int i=0; i <shelfSize; i++)
    bookshelf[i]=0;
}
//inserts a book to the end of the list
void Shelf::insert(int booknum){
    for(int i=0; i < shelfSize; i++)
    bookshelf[i] = booknum;
}

现在book_main.cpp,它应该只是给出一个菜单并提示用户:

//book_main.cpp
#include<iostream>

using namespace std;

#include "book.h"

int main(){

Shelf book; //creates a Shelf object named "book"
int isbn=0;
cout<<"Enter ISBN: "<<endl;
cin>>isbn;
book.insert(isbn);
return 0;
}

现在我意识到这个逻辑没有多大意义,除此之外我的程序还有很多。我正在淡化它,只是为了显示我遇到的问题。

1) 我应该如何在我的对象和成员函数等中设置数组?我想我的函数设计很糟糕,以及包含所有成员函数等的文件中的数组名称不正确。任何建议都将不胜感激。该程序编译但每次我调用 book.insert() 时都会崩溃

【问题讨论】:

  • 正如 Oli 所指出的,您无法访问空数组的成员。 :)
  • 你最好把bookshelf隐藏起来(转为私密:)。
  • 谢谢,@mattn,我正计划处理那个一次我得到了其他一切工作哈。

标签: c++ arrays class object


【解决方案1】:

试试这个:

//book.h
class Shelf{
public:
    static const int shelfSize = 20;
    Shelf();
    void insert(int);
    int bookshelf[shelfSize];
};

(您需要从构造函数中删除 bookshelf[shelfSize]; 行。)

您的构造函数可以通过利用初始化列表来简化:

Shelf::Shelf()
  : bookshelf()  // This initializes all elements to zero
{}

您的insert() 逻辑没有多大意义;您需要跟踪到目前为止已插入的项目数量,以便知道将下一个项目放在哪里。

另外,请考虑使用 std::vector 代替原始 C 样式数组。它们避免了一些问题,例如空间不足!

【讨论】:

  • 该构造函数是否真正将所有书架的值设置为0?它在哪里定义为 int 的默认值?
  • 它不需要设置任何东西为0,事实上,我更喜欢一个大小为20的数组大小,它还没有在每个元素中输入任何东西。
  • 哦,有趣!我不知道:)。为了清楚起见,也许将其添加到您的答案中(8.5.5)。 “默认初始化 T 类型的对象意味着:...如果 T 是数组类型,则每个元素都是默认初始化的; - 否则,对象是零初始化的。”定义是递归的,因为每个对象都被默认初始化:)。
  • @Daniel:是的!尽管您会注意到我匆忙删除了我的评论,因为这似乎在 C++0x 中发生了变化(措辞变为“否则,不执行初始化”)。所以我不想在这件事上成为权威!
  • @Daniel:(续...)啊,在C++0x中,空括号表示值初始化,这又变成了传统的以零初始化结尾的递归定义.
【解决方案2】:

bookshelf 没有空间。您的定义未确定大小。

//book.h
#define shelfSize 20

class Shelf{
public:
    Shelf();
    void insert(int);
    int bookshelf[shelfSize];
};

以及 book.h 的使用

//book.cpp
#include <iostream>  
#include "book.h"

Shelf::Shelf(){
    for(int i=0; i <shelfSize; i++)
        bookshelf[i]=0;
}

//inserts a book to the end of the list
void Shelf::insert(int booknum){
    for(int i=0; i < shelfSize; i++)
        bookshelf[i] = booknum;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多