You should only increase index if arr[i] == index or else you'll get the wrong result for arrays with duplicates, like {1,2,3,4,5,5,6,7}.
int missingNumber(int arr[], int n) { 
    std::sort(arr,arr + n);
    int index=1;
    int a;
    for(int i=0; i < n; i++) { 
        if(arr[i] > 0) {
            if(arr[i] == index) {       // equal, step
                ++index;
            } else if(arr[i] > index) { // greater, we found the missing one
                a=index;
                break;
            }                           // else, arr[i] == index - 1, don't step
        }
    }
    return index;
}
You are missing a great opportunity to use the sorted array though. Since you're only interested in positive numbers, you can use std::upper_bound to find the first positive number. This search is done very efficiently and it also means that you don't have to check if(arr[i] > 0) in every iteration of your loop.
Example:
int missingNumber(int arr[], int n) { 
    int* end = arr + n;
    std::sort(arr, end);        
    int* it = std::upper_bound(arr, end, 0); // find the first number greater than 0
    int expected = 1;
    
    while(it != end && *it <= expected) {
        if(*it == expected) ++expected;
        ++it;
    }
    
    return expected;
}
Alternatively, std::partition the array to put the positve numbers first in the array even before you sort it. That means that you'll not waste time sorting non-positive numbers.
int missingNumber(int arr[], int n) { 
    int* end = arr + n;
    end = std::partition(arr, end, [](int x){ return x > 0; });
    std::sort(arr, end);        
    int expected = 1;
    
    for(int* it = arr; it != end && *it <= expected; ++it) {
        if(*it == expected) ++expected;
    }
    return expected;
}