2017-09-17 24 views
1

Contactクラスのオブジェクトの空の配列を作成しようとしています。空の配列から始めて、AddressBookというオブジェクト配列にContactのオブジェクトを追加するためのAddrBook.cpp関数を作成します。C++でオブジェクトの空の配列を初期化するにはどうすればよいですか?

AdrBook.hで配列を適切に初期化していますか?

コンタクトのオブジェクトが特定のインデックスに存在するかどうかを確認するにはどうすればよいですか?


AddrBook.cpp

#include "AddrBook.h" 
namespace address_book_test 
{ 
    const int CAPACITY = 5; 

    void AddrBook::addContact(Contact& itemToAdd) // Add Contact to the AddrBook (using Contact object) 
    { 
     for (int i = 0; i < CAPACITY; i++) 
     { 
      if (/*Contact object does not exist at i*/) 
      { 
      /*Add Contact object*/ 
      return; 
      } 
     } 
     return; 
    } 
... 
} 

AddrBook.h

#ifndef ADDR_BOOK_H 
#define ADDR_BOOK_H 

#include <fstream> 
using namespace std; 

#include "Contact.h" 

namespace address_book_test 
{ 
    class AddrBook 
    { 
    public: 

     static const int CAPACITY = 5; 

     // CONSTRUCTOR 
     AddrBook() { used = 0; } 

     // Modification Member Functions 
     void addContact(Contact& itemToAdd); // Add Contact to the AddrBook (using Contact object) 
... 
    private: 
     static Contact addressBook[CAPACITY]; // The array used to store Contact objects 
     int used; // How much of addressBook is used 
    }; 
} 
#endif 

Contact.cpp

#ifndef CONTACT_H 
#define CONTACT_H 

#include <fstream> 
using namespace std; 

#include "Address.h" 
#include "Name.h" 

namespace address_book_test 
{ 
    class Contact 
    { 
    public: 

     // Constructor 
     Contact(string inLastName = "", 
      string inFirstName = "", 
      string inStreetAddress = "", 
      string inCity = "", 
      string inState = "", 
      string inZip = "", 
      string inPhone = "", 
      string inEmail = "", 
      string inBirthday = "", 
      string inPictureFile = "") 
     { 
      Name(inLastName, inFirstName); 
      Address(inStreetAddress, inCity, inState, inZip); 
      setPhone(inPhone); 
      setEmail(inEmail); 
      setBirthday(inBirthday); 
      setPictureFile(inPictureFile); 
     } 
... 
     private: 
     Name fullName; 
     Address fullAddress; 
     string phone; 
     string email; 
     string birthday; 
     string pictureFile; 
    }; 
} 
#endif 
+1

アレイは固定サイズです。空の配列を持つことはできません。常に正確に 'CAPACITY'個の要素を持っています。サイズを変更する必要がある場合は、 'std :: vector'を使用してください。 – nwp

+0

「i」の位置にオブジェクトが既に存在します。あなたが行うことができる唯一のことは、それをコピーで上書きすることです。 – user0042

答えて

2

配列を使用しないでください、使用:

std::vector<Contact> addressBook; 

代わりの

static Contact addressBook[CAPACITY]; 

そして、あなたは本当にそれが静的に定義する必要がありますか?

ベクトルでは、変数 "used"は必要ありません。あなたが持っているどのように多くの連絡先を知りたい場合は、あなただけが特定の連絡先を探したい場合は、今すぐ

addressBook.size(); 

を記述する必要がある、あなたが使用できます:

if(find(addressBook.begin(), addressBook.end(), my_contact) != addressBook.end()){ 
... 
} 
0

あなたが持っています変数 'used'と呼ばれるので、この変数を使用して配列内の位置の数を追跡したい場合は、配列内の別の領域を埋めるときにその変数を増やしてからif if(i> = used){} 配列はインデックス0から始まり、それが満たされたときに覚えておく必要がありますur変数は1であるため、常に最後に塗りつぶされたインデックスよりも1つ高いです。

0

あなたがあなたのベクトルをintializeするなcall_onceを使用することができ、あなたのアプリのメモリフットプリントを削減したい場合は、最初の時間にあなたが

std::vector<Contact> addressBook; 

void AddContact(string Contact) { 
    std::call_once(onceFlag, [this] { this->addressBook.reserve(1000); cout << "size Reserved" << endl; }); 
    addressBook.push_back(Contact); 
} 

「サイズ予約済み」のみ表示されますアドレス帳に要素を追加一度