2010-04-10 29 views
6

Trong C++, tôi có thể thay đổi các nhà điều hành trên một lớp học cụ thể bằng cách làm một cái gì đó như thế này:điều hành quá tải trong C

MyClass::operator==/*Or some other operator such as =, >, etc.*/(Const MyClass rhs) { 
    /* Do Stuff*/; 
} 

Nhưng với việc không có các lớp học (được xây dựng theo mặc định) trong C. Vì vậy, làm thế nào Tôi có thể làm điều hành quá tải chỉ cho các chức năng chung?

Ví dụ: nếu tôi nhớ chính xác, nhập stdlib.h sẽ cung cấp cho bạn toán tử ->, chỉ là cú pháp đường cho (* strcut_name) .struct_element.

Vậy làm cách nào tôi có thể thực hiện việc này trong C?

Cảm ơn bạn.

+0

Tôi không chắc chắn những gì bạn đang ngụ ý bằng cách nói "không có lớp học (được xây dựng trong theo mặc định)", nhưng không có lớp học trong C, thời gian. Được xây dựng trong hoặc cách khác. Và những gì bạn có nghĩa là quá tải nhà điều hành cho các chức năng? Điều đó không có ý nghĩa. – meagar

+0

Vâng, bạn có thể tạo một mô hình đối tượng trong C với các lớp, nhưng nó sẽ không bằng cách sử dụng cú pháp khác với cú pháp C thuần túy. Đối với những nỗ lực của tôi tại đây, hãy xem http://jonsterling.github.com/2009/08/28/implementing-object-oriented-programming-in-pure-c.html và http://jonsterling.github.com/2009 /09/07/object-oriented-programming-in-c-mark-two.html. –

+0

Jonathan có trực giác thích hợp như những gì tôi đang phải chịu đựng. Tôi đã nói rằng bạn có thể buộc C vào một mô hình OOP. –

Trả lời

15

Đồng bằng cũ C không có quá tải toán tử dưới bất kỳ hình thức nào. Nhà điều hành "->" để truy cập thành viên của con trỏ là tiêu chuẩn C và không được giới thiệu bởi bất kỳ tệp tiêu đề nào.

+0

Thật vậy. '->' chỉ là cú pháp đặc biệt vì các con trỏ tới các cấu trúc rất phổ biến. – avpx

+0

Tôi hiểu. Vì vậy, về cơ bản, loại duy nhất của quá tải nhà điều hành sẽ là một số loại chỉ thị tiền xử lý, giả sử: #define plus (a, b) a + b. Mặc dù, điều đó sẽ không cho phép bất kỳ hình thức tham số nào, trừ khi bạn bằng cách nào đó có thể làm cho nó thay đổi a và b thành tên tham số thực tế ... –

+5

@Leif: Tôi không nghĩ rằng macro phù hợp với những gì bạn nói. Nếu bạn muốn 'struct foo' có một số khái niệm bổ sung, thì bạn thường sẽ định nghĩa một hàm' foo add_foos (foo lhs, foo rhs) 'hoặc một cái gì đó ở mức độ đó. Không cần phải nhận được tiền xử lý liên quan đến điều này. Nếu bạn chuyển sang C++ sau, bạn có thể quá tải '+' để gọi 'add_foos'. –

1

Nhà điều hành dereferencing cấu trúc con trỏ -> là một phần của thông số C. stdlib.h không ảnh hưởng đến điều này.

+0

Chuột, được rồi, cảm ơn bạn. Tôi nhớ một sinh viên tốt nghiệp tại trường đại học của tôi nói với tôi điều đó. –

+0

Đừng tin tưởng một sinh viên tốt nghiệp biết bất cứ điều gì về một ngôn ngữ, trừ khi anh ta viết một bản thực hiện nó. :) – greyfade

5

Toán tử cài sẵn trong ngôn ngữ C là bị quá tải. Thực tế là bạn có thể sử dụng số nhị phân + để tổng số nguyên, số dấu phẩy động và thực hiện số học con trỏ là một ví dụ kinh điển của quá trình vận hành quá tải.

Tuy nhiên, C không cung cấp tính năng nào cho quá tải nhà điều hành cấp người dùng. Bạn không thể xác định các toán tử của riêng bạn trong C.

1

Chắc chắn, bạn không thể quá tải toán tử trong C. Toán tử -> là một phần của ngôn ngữ C, không cần #include.

Các vấn đề liên quan