1

ここに C++ の初心者がいて、これが私の最初の投稿です。私は学校でプロジェクトに取り組んでいますが、いくぶん立ち往生しています。私の仕事は、コースの名簿を作成することです。各名簿には、コース名、コース コード、コース単位、および教授名が含まれます。問題ありません。名簿クラスがあります。問題は、オブジェクトの配列を動的にする方法がわからないことです。これは、ユーザーが要求したときに拡大および縮小できる必要があるためです。私は一般的に動的配列にある程度精通していますが、オブジェクトの動的配列の構文についてはよくわかりません。そして、教授の指示によると、ベクトルはオプションではありません. このフォーラムだけでなく、インターネット上の他の領域も検索しましたが、答えが見つからないか、見つけた答えを理解できず、ここに投稿しようと思いました。以下は、オブジェクトの非動的配列のコードです。動的配列への変換の助けをいただければ幸いです。ありがとう!

StudentEnrollment.h:

#ifndef STUDENTENROLLMENT_H
#define STUDENTENROLLMENT_H

# include <iostream>
# include <string>

using namespace std;

class Roster {

private:

    string courseName;
    string courseCode;
    string courseCredits;
    string professorName;

public:

    void setCourseName ( string );
    void setCourseCode ( string );
    void setCourseCredits ( string );
    void setProfessorName ( string );

    string getCourseName();
    string getCourseCode();
    string getCourseCredits();
    string getProfessorName();

    Roster ();

};

#endif;

StudentEnrollment.cpp:

#include <iostream>
#include <string>
#include "StudentEnrollment.h"

using namespace std;

// Roster class implementation

Roster::Roster () {

    courseName = "";
    courseCode = "";
    courseCredits = "";
    professorName = "";


}   


void Roster::setCourseName ( string cn ) {
    courseName = cn;
}

void Roster::setCourseCode ( string c ) {
    courseCode = c;
}

void Roster::setCourseCredits ( string cc ) {
    courseCredits = cc;
}

void Roster::setProfessorName ( string pn ) {
    professorName = pn;
}

string Roster::getCourseName() {
    return courseName;
}

string Roster::getCourseCode() {
    return courseCode;
}

string Roster::getCourseCredits() {
    return courseCredits;
}

string Roster::getProfessorName() {
    return professorName;
}

main.cpp:

#include <iostream>
#include <string>
#include "StudentEnrollment.h"

using namespace std;

int main (int argc, char * const argv[]) {

    int number_of_rosters = 0;

    string course, code, credits, name;

    cout << "Enter the number of rosters you would like to create: ";
    cin >> number_of_rosters;
    cin.ignore(100, '\n');


    Roster roster[number_of_rosters];

    for ( int i = 0; i < number_of_rosters; i++){
        cout << "Enter course name: ";
        getline(cin,course);
        roster[i].setCourseName(course);

        cout << "Enter course code; ";
        getline(cin, code);
        roster[i].setCourseCode(code);

        cout << "Enter course credits: ";
        getline(cin, credits);
        roster[i].setCourseCredits(credits);

        cout << "Enter professor name: ";
        getline(cin, name);
        roster[i].setProfessorName(name);

        cout << "Next course..." << endl;
    }

    cout << endl;

    for ( int i = 0; i < number_of_rosters; i++){
        cout << roster[i].getCourseName() << endl;
        cout << roster[i].getCourseCode() << endl;
        cout << roster[i].getCourseCredits() << endl;
        cout << roster[i].getProfessorName() << endl;
        cout << endl;
    }

    return 0;
}

これが正しくフォーマットされていない場合はご容赦ください。これは私の最初の投稿です。

アーサー

4

2 に答える 2

1

独自のデータ構造を実装する必要があると思います。私の知る限り、c++ はこれをネイティブにサポートしていないため、ベクトルを使用しています。

独自のデータ構造を実装する必要があるこの種の問題については、 linklistが適切な解決策になると思います。

これはvectors内部で実装されている方法である可能性があり、それらは異なるソリューションです。

基本的に、LinkList は、接続されたノードで構成される特別なデータ構造です。これは、各要素が値 (この場合は名簿) を保持するチェーンと、次の要素へのリンクおよび/または前の要素へのリンクと考えてください。など... 要素を追加したい場合は、要素を最後または最初に追加するだけです。要素を削除したい場合は、要素を切り取って2つの要素を接続するだけです.棒のようなオブジェクトの配列で、どちらの端にも物を追加することはできず、できたとしてもカットすることはできません。シームレスに接続して元に戻すことができます。

リンクリストには多くのバリエーションがありますが、それが要点です。

一方、動的配列を使用する場合は、すべての値を新しい大きな配列に手動でコピーし、前の配列を破棄する必要があります。これは非常にコストがかかり、根本的に非常に危険な場合があります。使用できるコピー コンストラクターを実装しますmemcpyが、オブジェクトが他のオブジェクトへの参照またはポインターを保持している場合、これは非常に危険です。

また、デフォルト コンストラクター、コピー コンストラクター、代入演算子のいずれかを指定しない場合、C++ コンパイラは以下を挿入することに注意してください。この場合は問題ありません。つまり、生のポインターはありませんが、ランタイム バグが発生し始め、その理由がわからない場合に留意する必要があります。

于 2012-08-23T18:30:39.280 に答える
0

ユーザーの要求に応じて配列を拡大または縮小するには、目的のサイズの新しい配列を作成し、要素を 1 つずつコピーします。これは O(n) 操作ですが、スタック上で明示的に宣言するか、ポインターで new または malloc を使用しない限り、メモリにアクセスすることはできません。

いずれにせよ、目的の成長後/縮小後のサイズの 2 番目の配列を作成することができます。変数のポインターを新しく作成された配列に移動できるように、 new/malloc を使用することをお勧めします。また、メモリを新しいアレイにコピーした後、アレイからメモリをクリーンアップすることをお勧めします。

リンクされたリストなど、別のデータ構造も考慮される場合があります。

于 2012-08-23T18:13:08.147 に答える