2016-10-13 23 views
1

私はクラスプロジェクトを持っており、各プロジェクトは異なるタスクを持つことができます。セッターとゲッター/クラス

Project.h:

#pragma once 
#include "Task.h" 
#include <vector> 

using namespace std; 

class Project 
{ 
    private: 
    vector<Task> Tasks; 
    public: 

    Project::Project(int inleesgetal);//constructor 

    vector<Task> GetTasks(); 
}; 

Project.cpp:

#include "Project.h" 
#include <string> 
#include <vector> 
Project::Project(int inleesgetal) 
{ 

    //constructor 
    Tasks.resize(Numbertasks); 
} 

vector<Task> Project::GetTasks() 
{ 
    return Tasks; 
} 

Task.h:

#pragma once 
#include <vector> 

using namespace std; 

class Task 
{ 

    private: 
    //Info: 

    int StartTime_Solo; 

    public: 

    Task(); //constructor 

    void SetStartTime_Solo(int st_s); 

    int GetStartTime_Solo(); 

}; 

Task.cpp:

#include "Task.h" 
#include <string> 
#include <vector> 
#include <iostream> 

using namespace std; 


Task::Task() 
{ 
    //constructor 
    StartTime_Solo = 0; 
} 

int Task::GetStartTime_Solo() 
{ 
    return StartTime_Solo; 
} 

void Task::SetStartTime_Solo(int st_s) 
{ 
    StartTime_Solo = st_s; 
} 

メイン:今

#include <iostream> 
#include <vector> 

#include "Task.h" 
#include "Project.h" 

using namespace std; 


int main() 
{ 

    Project Project1(6); 

    Project1.GetTasks()[2].SetStartTime_Solo(55); 
    cout << "test:" << Project1.GetTasks()[2].GetStartTime_Solo(); 
    return 0; 
} 

私は55のSTARTTIMEにProject1の第三の課題を設定し、それはまだ、結果として私に0を与える開始時刻をプリントアウトしてみてください。 これはなぜですか?そして、実際に開始時間を55に設定するように、コードをどのように変更できますか?

+1

'setX'と' getX'の形式のセッターとゲッターは、実際に_Java-ish_です。 – skypjack

+1

'Vector GetTasks();'メンバーのコピーを返します。ベクタータスク; 'Project1.GetTasks(2).SetStartTime_Solo(55);'はコピーのみを更新します。 BTW:小文字で変数とメンバを記述する必要があります。変数/メンバとクラスを区別する方がずっと簡単です。 –

+0

['名前空間std;'を避けてください](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) - 特にヘッダーで。 –

答えて

2
vector<Task> GetTasks(); 

定義と

const vector<Task>& GetTasks() const; 
vector<Task>& GetTasks(); 

そしてそうでなければならない:

vector<Task> Project::GetTasks() 
{ 
    return Tasks; 
} 

は次のようになります。

const vector<Task>& Project::GetTasks() const { return Tasks; } 
vector<Task>& Project::GetTasks() { return Tasks; } 
2

問題は、あなたがvector<Task>のコピーを戻ってきているということですから機能。その後、このコピーを修正して、すぐに破棄します。 Projectの内部メンバーは変更されません。

あなたは、このように参照によって返す場合:

vector<Task>& GetTasks(); 

その後、あなたは基本的に内部ベクトルを指し、そしてあなたがそれを修正するときに、あなたが実際にあなたのクラスのメンバーデータを修正する何かを戻ってきています。

+0

あなたはconstバージョン(そして揮発性のもの)を見逃しましたが、これが理由を説明しました。 – UKMonkey

+0

ありがとう! 私はこれで作業しようとしましたが、まだ質問があります。 これをProject.cppのコンストラクタに追加しました。Projectduration = 0; 2つのメソッド: int Project :: GetProjectDuration() { \t return Projectduration; } void Project :: SetProjectDuration(int prdur) { \t Projectduration = prdur; } – Pieter

+0

とメイン: Project1。SetProjectDuration(10); cout << "Projectduration:" << Project1.GetProjectDuration(); これはうまくいくようですか?なぜポインタを必要としないのですか? – Pieter

関連する問題