Behöver skriva OOP i C programmering - Några förslag?

Permalänk

Behöver skriva OOP i C programmering - Några förslag?

Jag vill översätta lite enkel C++ kod som innehåller objekt och vektorer. Då hade jag tänkt att om jag skapar ett små funktioner som kan hantera objekt. Då borde jag kunna lösa detta problem.

C++ koden är enkel. Den är största delen C kod, men den innehåller vissa objekt och vektorer.

Koden kan se ut exempelvis så här:

keypoints.push_back(KeyPoint(Point2f((float)x, (float)y), 7.0f));

eller

makeAgastOffsets(pixel_7_12d_, (int)img.step, AgastFeatureDetector::AGAST_7_12d);

Jag är inte behov utav inkapsling (encapsulation) och arv inom OOP. Jag är mer intresserad utav polymorphism.
Låt oss säga att vi skulle göra en länkad lista i C och den ska kunna ta in ett argument som är en struktur. Jag har tänkt att använda strukturer som objekt.

Hur skulle ni ha gjort om ni vill göra:

  • Länkad lista som en vektor

  • Använda strukturer som objekt

  • Polymorphism i strukturen

I C?

Målet jag vill uppnå är att typ skriva om enkel C++ kod, som är i största delen C kod, men innehåller vissa funktionaliteter som C saknar.

Permalänk
Hedersmedlem

En vanlig lösning är väl att skriva ett litet mellanlager i c++ som exponerar ett (troligen förenklat) c-gränssnitt som den andra applikationen kan använda?

Permalänk
Skrivet av Elgot:

En vanlig lösning är väl att skriva ett litet mellanlager i c++ som exponerar ett (troligen förenklat) c-gränssnitt som den andra applikationen kan använda?

Så om jag ska skriva om cv::mat som är matris för OpenCV. Då kan jag göra en struktur istället med typedefinition cv_mat?

Jag väljer att skriva om OpenCV C++ kod för att jag vill inte uppfinna hjulet på nytt.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Så om jag ska skriva om cv::mat som är matris för OpenCV. Då kan jag göra en struktur istället med typedefinition cv_mat?

Jag väljer att skriva om OpenCV C++ kod för att jag vill inte uppfinna hjulet på nytt.

Ja, troligen. Såhär skulle man till exempel kunna använda en std::string från c:

//string_wrapper.h #ifndef STRING_WRAPPER_H #define STRING_WRAPPER_H #ifdef __cplusplus extern "C" { #endif struct string_wrapper; struct string_wrapper* new_string(const char* str); const char* get_string(struct string_wrapper* sw); int get_size(struct string_wrapper* sw); void free_wrapper(struct string_wrapper* sw); #ifdef __cplusplus } #endif #endif

//string_wrapper.cpp #include "string_wrapper.h" #include <string> struct string_wrapper { std::string str; }; string_wrapper* new_string(const char* str) { string_wrapper* sw = new string_wrapper(); sw->str = str; return sw; } const char* get_string(string_wrapper* sw) { return sw->str.c_str(); } int get_size(string_wrapper* sw) { return sw->str.size(); } void free_wrapper(string_wrapper* sw) { delete sw; }

#include <stdio.h> #include "string_wrapper.h" //main.c int main() { struct string_wrapper* sw = new_string("Hello world"); printf("%s: %d\n", get_string(sw), get_size(sw)); free_wrapper(sw); return 0; }

Permalänk

Hmm...
tackar.

Det är OpenCV som jag behöver lite kod utav. Nu när jag läser OpenCV's kod...Mycket "TODO..." och "Not optimized yet...".
Koden går att översätta, men jag tror det blir nog mer optimalt om jag skriver egen C kod.

Permalänk

Kör C++ för de bitarna som utnyttjar OpenCV. Det blir inte effektivare för att du skriver samma sak i C.

Permalänk
Skrivet av Ingetledigtnamn:

Kör C++ för de bitarna som utnyttjar OpenCV. Det blir inte effektivare för att du skriver samma sak i C.

Det blir mer portabelt och jo, det blir snabbare om jag skriver projekt i C än C++, generellt talat.
Med C så tänker man hela tiden på minnet. I C++ så löser man problemet bara.

Permalänk
Skrivet av heretic16:

Det blir mer portabelt och jo, det blir snabbare om jag skriver projekt i C än C++, generellt talat.
Med C så tänker man hela tiden på minnet. I C++ så löser man problemet bara.

Det är ju i så fall ett val du har gjort när du skrev din kod. Det är inte för C är effektivare än C++, eller hur? Jag har svårt att se att programmet skall bli effektivare för att du bygger ett hemsnickrat OOP-lager i C. Att konvertera saker och ting som skall skickas in till OpenCV och det som returneras, det kostar både cykler och minne (dubbelallokering).

På din önskelista stod:

* Länkad lista som en vektor

Det går fint i C++. Allocators och placement new ger dig ganska bra kontroll på minneshanteringen.

* Använda strukturer som objekt

Strukturer är object i C++.

* Polymorphism i strukturen

Den vanliga metoden att hantera polymorfism är att låta strukturen innehålla ett par funktionspekare eller en pekare till en tabell med funktionspekare. Detta sköter C++-kompilatorn åt dig utan att du behöver bry dig.

Men om du tror dig kunna göra ett bättre jobb än C++-kompilatorn så gör ett försök. Det är din tid du spenderar. Rapportera gärna hur mycket snabbare det gick, hur mycket tid det tog och om du tyckte att det var värt mödan.