ฉันสามารถประกาศและกำหนดตัวแปรคลาสคงที่ในไฟล์ .CPP เดียวกันได้หรือไม่

ใน .cpp ของฉัน ฉันมีการประกาศคลาสและคำจำกัดความทั้งคู่ มีข้อผิดพลาดเมื่อฉันพยายามเริ่มต้นอาร์เรย์สตริงโดยใช้วิธีใดวิธีหนึ่งที่แนะนำ

class week
{
public:
    week();
    static const char * const days[];
}

week::week()
{
 const char * const week::days = {"monday" , "tuesday" "etc..."}
}

ฉันได้รับข้อผิดพลาดในการกำหนดนิยามใหม่สำหรับตัวแปรวันซึ่งถูกต้อง แต่ฉันต้องการการเปลี่ยนแปลงที่ฉันต้องทำกับโค้ดด้านบนเพื่อที่จะทำงานในไฟล์ .cpp เดียวกัน

ที่นี่ฉันไม่ได้ใช้ไฟล์ส่วนหัวเพื่อประกาศคลาส ทั้งการประกาศคลาสและคำจำกัดความอยู่ในไฟล์ SAME .cpp

ขอบคุณ


person user987316    schedule 26.09.2014    source แหล่งที่มา


คำตอบ (4)


ในไฟล์ C++ คุณควรเขียน

const char * const week::days[] = {"monday", ...};
//                            ^^  <- don't forget these      

ควรอยู่ในขอบเขตส่วนกลาง ไม่ใช่ในตัวสร้าง ตัวสร้างไม่ควรเกี่ยวข้องกับการเริ่มต้นสมาชิกแบบคงที่

person Armen Tsirunyan    schedule 26.09.2014

คุณจะต้องการทำสิ่งนี้:

class week
{
public:
    week();
    static const char * const days[];
};

week::week()
{

}

const char * const week::days[] = {"monday" , "tuesday", "etc..."};

void main()
{
    week w;
}

อัปเดต:

ดูข้อผิดพลาดเล็กน้อยที่ฉันแก้ไข:

  1. เพิ่ม ; ที่ส่วนท้ายของชั้นเรียน
  2. ย้ายการเริ่มต้นของตัวแปรคงที่ days ภายนอก คลาสและเพิ่ม ; ให้กับคำสั่งการเริ่มต้นด้วยเช่นกัน

ตัวแปรแบบคงที่จะถูกเตรียมใช้งานในขอบเขตส่วนกลาง (หลังคำจำกัดความของคลาส) ตัวสร้างใช้เพื่อเริ่มต้นตัวแปรสมาชิกของอินสแตนซ์อ็อบเจ็กต์ ปัจจุบัน เท่านั้น

เมื่อมีคำถามเกี่ยวกับการใส่โค้ดทั้งหมดลงในไฟล์เดียวกัน (.cpp) คำตอบคือใช่ คุณสามารถใส่โค้ดทั้งหมดของคุณในไฟล์เดียวกันและคอมไพล์แล้วโค้ดก็จะใช้งานได้
อย่างไรก็ตาม เราไม่แนะนำให้ทำเช่นนั้น
ตามแบบแผน ไฟล์ส่วนหัว (.h) มีการประกาศ และ (.cpp) มีคำจำกัดความ

ดังนั้น เมื่อปรับโครงสร้างโค้ดด้านบนใหม่ ฉันจะได้รับไฟล์ต่อไปนี้พร้อมกับโค้ดที่เกี่ยวข้อง:

ไฟล์: week.h

class week
{
public:
    week();
    static const char * const days[];
};

ไฟล์: week.cc (หรือ week.cpp)

#include "week.h"
const char * const week::days[] = {"monday" , "tuesday", "etc..."};

week::week()
{

}

ไฟล์: main.cc (หรือ main.cpp)

#include "week.h"
void main()
{
    week w;
}
person galdin    schedule 26.09.2014

คุณต้องประกาศสมาชิกข้อมูลคงที่ภายนอกฟังก์ชันคลาส

eg:

class week
{
public:
    week();
    static const char * const days[];
};

char * week::days[] = {"monday" , "tuesday" "etc..."};

week::week()
{
}

คุณจะเห็นปัญหาเดียวกันนี้หากคุณแยกคำจำกัดความของคลาสออกเป็นไฟล์ส่วนหัว (.h/.hpp)

person Simon Featherstone    schedule 26.09.2014
comment
ไม่ประกาศ แต่กำหนด (คำประกาศของสมาชิกอยู่ในคำจำกัดความของชั้นเรียน) - person molbdnilo; 26.09.2014

ตามแนวทางทั่วไป อย่ากำหนดฟังก์ชันสมาชิกในไฟล์ส่วนหัว เว้นแต่ว่าฟังก์ชันเหล่านั้นถูกกำหนดไว้อย่างชัดเจนเป็นแบบอินไลน์ (ซึ่งหมายความว่าฟังก์ชันเหล่านั้นควรเป็นตัวเลือกที่ดีสำหรับการอินไลน์จากมุมมองของคอมไพเลอร์ด้วย )

เมื่อคุณสร้างฟังก์ชันแบบอินไลน์นั้นขึ้นอยู่กับคอมไพลเลอร์ว่าจะเลือกให้สร้างแบบอินไลน์หรือไม่ด้วยเหตุผลด้านการปรับให้เหมาะสมบางประการ มีสองวิธีในการประกาศฟังก์ชันแบบอินไลน์

1) Implicit:-
Class Data
{
 public:
   void send()      
   {
   }
};
2) Explicit:-
class Data
{
  void send();
};
inline void Data::send()
{
}
person ravi    schedule 26.09.2014
comment
ฉันจะกำหนดพวกมันภายในคลาสได้อย่างไร? - person user987316; 26.09.2014
comment
มีสองวิธี:- 1) Class X { void send() { } }; . นี่ถือว่าโดยปริยายเป็นแบบอินไลน์ (แม้ว่าจะขึ้นอยู่กับคอมไพเลอร์ก็ตาม) 2) คลาส X {}; inline void X::send() { } ( คุณกำลังร้องขอให้คอมไพเลอร์ทำให้เป็น inline ) - person ravi; 26.09.2014
comment
โปรดแนะนำฉันทำอย่างนั้น - person user987316; 26.09.2014
comment
ไม่เคยกำหนดฟังก์ชั่นสมาชิกในไฟล์ cpp อะไร? ดูเหมือนว่าคุณกำลังแนะนำว่าโค้ด ทั้งหมด ควรอยู่ในไฟล์ส่วนหัว คุณจะต้องปกป้องสิ่งนั้น - person John Dibling; 26.09.2014
comment
นั่นเป็นความผิดของฉัน ฉันขอโทษ - person ravi; 28.09.2014