كيف يمكنني استخدام وظائف الأعضاء من صفائف ثابتة في C ++؟

StackOverflow https://stackoverflow.com/questions/1639393

  •  08-07-2019
  •  | 
  •  

سؤال

وهنا هو نسخة مبسطة من ما لدي (لا يعمل):

وprog.h:

...
const string c_strExample1 = "ex1";
const string c_strExample2 = "ex2";
const string c_astrExamples[] = {c_strExample1, c_strExample2};
...

وprog.cpp:

...
int main()
{
    int nLength = c_astrExamples.length();
    for (int i = 0; i < nLength; i++)
        cout << c_astrExamples[i] << "\n";
    return 0;
}
...

وعندما أحاول بناء، وأحصل على الخطأ التالي: خطأ C2228: يسار 'مدة العرض' يجب أن يكون الطبقة / البنية / ويسترن

ويحدث الخطأ فقط عندما أحاول استخدام وظائف الأعضاء في c_astrExamples. لو كنت محل "c_astrExamples.length ()" مع عدد 2، كل شيء يظهر للعمل بشكل صحيح.

وأنا قادرة على استخدام وظائف عضوا في c_strExample1 وc_strExample2، لذلك أعتقد أن ينشأ السلوك من بعض الفرق بين استخدامي سلاسل مقابل صفائف السلاسل.

هل لي التهيئة في prog.h الخطأ؟ هل أنا بحاجة إلى شيء خاص في prog.cpp؟

هل كانت مفيدة؟

المحلول

والمصفوفات في C ++ لا يكون لها وظائف الأعضاء. يجب عليك استخدام مجموعة مثل vector<string> إذا كنت تريد كائن، أو حساب طول مثل هذا:

int nLength = sizeof(c_astrExamples)/sizeof(c_astrExamples[0]);

نصائح أخرى

STL ناقلات سلاسل بدلا من مجموعة:

#include <string>
#include <vector>
using namespace std;

const string c_strExample1 = "ex1";
const string c_strExample2 = "ex2";
vector<string> c_astrExamples;
c_astrExamples.push_back(c_strExample1);
c_astrExamples.push_back(c_strExample2);

int main()
{
    int nLength = c_astrExamples.size();

والمصفوفات في C ++ موروثة من C، الذي لم يعترض المنحى. بحيث لا تكون الأشياء وليس لديهم وظائف الأعضاء. (وفي ذلك يتصرفون مثل int، float وغيرها من أنواع المدمج في.) من أن أصل وقف المزيد من المشاكل مع مجموعة، مثل حقيقة أنهم بسهولة (على سبيل المثال، عندما انتقلت إلى وظيفة) الاضمحلال في مؤشر إلى العنصر الأول مع عدم وجود حجم المعلومات اليسار.

والنصيحة المعتادة لاستخدام std::vector بدلا من ذلك، وهي مجموعة يمكن تغيير حجم حيوي. ومع ذلك، إذا كنت يعرف حجم مجموعة في الترجمة من الوقت وكنت في حاجة الى ثابت، ثم <وأ href = "http://www.boost.org/doc/libs/1_40_0/doc/html/array.html" يختلط = "نوفولو noreferrer"> دفعة من نوع مصفوفة (وboost::array، إذا يدعم المترجم الخاص بك ملحقات مستوى TR1 متاحة أيضا كما std::tr1::array، لتصبح std::array في الإصدار التالي من C ++ القياسية) هو ما تريد.

تحرير 1 :

وهناك طريقة آمنة للحصول على طول صفيف في C ++ ينطوي على مجموعة لا تصدق من القوالب، ومؤشرات الدالة وحتى ماكرو ألقيت في مزيج:

template <typename T, std::size_t N>
char (&array_size_helper(T (&)[N]))[N];

#define ARRAY_SIZE(Array_) (sizeof( array_size_helper(Array_) ))

إذا (مثلي) أعتقد أن هذا هو المضحك، أن ننظر في <لأ href = "http://www.boost.org/doc/libs/1_40_0/doc/html/array.html" يختلط = "noreferrer نوفولو "> boost::array .

تحرير 2 :

وكما dribeas قال في تعليق، إذا كنت لا تحتاج إلى وقت التحويل البرمجي ثابت، وهذا

template <typename T, std::size_t N>
inline std::size_t array_size(T(&)[N])
{return N;}

ويكفي (وأسهل بكثير لقراءة وفهم).

وc_astrExamples غير صفيف، لا يوجد "طول ()" طريقة في ذلك.

في صفائف C ++ ليسوا كائنات وليس لديهم طرق على ذلك. إذا كنت بحاجة للحصول على طول المصفوفة التي يمكن أن تستخدم الماكرو التالي

#define COUNTOF( array ) ( sizeof( array )/sizeof( array[0] ) )
int nLength = COUNTOF(c_astrExamples);

وبالإضافة إلى ذلك، حذار من initialisation في ملف الرأس. هل خطر الإساءة إلى رابط.
يجب أن يكون لديك:

وprog.h:

extern const string c_strExample1;
extern const string c_strExample2;
extern const string c_astrExamples[];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top